Search

5.8 — Break and continue

Break

Although you have already seen the break statement in the context of switch statements, it deserves a fuller treatment since it can be used with other types of loops as well. The break statement causes a do, for, switch, or while statement to terminate.

Breaking a switch

In the context of a switch statement, a break is typically used at the end of each case to signify the case is finished (which prevents fall-through):

Breaking a loop

In the context of a loop, a break statement can be used to cause the loop to terminate early:

This program allows the user to type up to 10 numbers, and displays the sum of all the numbers entered at the end. If the user enters 0, the break causes the loop to terminate early (before 10 numbers have been entered).

Note that break can be used to get out of an infinite loop:

Break vs return

New programmers often have trouble understanding the difference between break and return. A break statement terminates the switch or loop, and execution continues at the first statement beyond the switch or loop. A return statement terminates the entire function that the loop is within, and execution continues at point where the function was called.

Continue

The continue statement provides a convenient way to jump back to the loop conditional earlier than normal, which can be used to bypass the remainder of the loop for an iteration. Here’s an example of using continue:

This program prints all of the numbers from 0 to 19 that aren’t divisible by 4.

Be careful when using a continue statement with while or do-while loops. Because these loops typically increment the loop variables in the body of the loop, using continue can cause the loop to become infinite! Consider the following program:

This program is intended to print every number between 0 and 9 except 5. But it actually prints:

0 1 2 3 4

and then goes into an infinite loop. When count is 5, the if statement evaluates to true, and the loop returns back to the top. The count variable is never incremented. Consequently, on the next pass, count is still 5, the if statement is still true, and the program continues to loop forever.

Note that with do-while loops, continue actually jumps to the bottom of the loop, since that’s where the conditional is:

This prints:

0 1 2 3 4 6 7 8 9

Using break and continue

Many textbooks caution readers not to use break and continue, both because it causes the execution flow to jump around and because it can make the flow of logic harder to follow. For example, a break in the middle of a complicated piece of logic could either be missed, or it may not be obvious under what conditions it should be triggered.

However, used judiciously, break and continue can help make loops more readable by keeping the number of nested blocks down and reducing the need for complicated looping logic.

For example, consider the following program:

This program uses a boolean variable to control whether the loop continues or not, as well as a nested block that only runs if the user doesn’t exit.

Here’s a version that’s easier to understand, using a break statement:

In this version, by using a single break statement, we’ve avoided the use of a boolean variable (and having to understand both what its intended use is, and where it is set), an else statement, and a nested block.

Minimizing the number of variables used and keeping the number of nested blocks down both improve code understandability more than a break or continue harms it. For that reason, we believe judicious use of break or continue is acceptable.

5.9 -- Random number generation
Index
5.7 -- For statements

38 comments to 5.8 — Break and continue

  • Najla

    Thank you so much, that was very helpful to me.

  • DrSuse

    Considering this little snippet:

    int iii=0;
    while (iii < 10)
    {
    if (iii==5)
    continue;
    cout << iii << " ";
    iii++;
    }

    Is there any elegant way to make this work as intended as a “while” function?
    If you put the increment (iii++) before the if, then “0” never gets printed. The only way I know to get “0” included in the output this way is to initialize iii as -1, which seems like a very sloppy way to do things.
    You could replace “continue;” with an “iii++” and get the desired result, , but I would like to see how this could be done, simply and elegantly, using the “continue” statement.

    • deadLOCC3D


      int iii=0;
      while (iii < 10)
      {
      if (iii==5)
      {
      iii++;
      continue;
      }
      cout << iii << " ";
      iii++;
      }

      • Alex

        This works but is somewhat inelegant, since you have two places where the loop variable can get incremented.

        Personally, I’d use a for loop, because a for loop will always increment the loop variables even if continue is used.

        You could also invert the logic:

  • A suggestion for a useful coding style:

    When using break and/or continue in loops, try to have them either right at the start or end, preferably at the start, so they are easy to spot and thus keeping the control flow easy to read.

    Another suggestion, wouldn’t having a chapter about understanding the flow of the loops be appropriate? I’m mostly thinking of things like is there an invariant (eg. int count tells us which numbers has been printed so far) and are there any termination conditions, so the loop can actually terminate. And also as you touch upon with the continue are there any control flow that can make the termination condition(s) inaccessible.

  • Todd

    Typo.

    In the first block of code you reference, all your function names begin with a capital letter (e.g., DoAddition), but these should begin with a lowercase letter by naming conventions (e.g., doAddition)

  • cpplx

    a lot of comments about the content of this lesson.
    mine will be about the use of the term "program" for a snippet
    and the usage of post(blah++) instead of pre(++blah) increment.
    minor things but they confuse me as a beginner in what is the proper way.
    i hope this comments are helpful for future updates and revisions instead of annoying 🙂

  • Niranjan

    Hi Alex,
    Really great tutorial. However I am one of those people who is just revisiting c++ to brush up the skills and avoiding the pitfalls. I think what would be great is if you can add a small box (with an icon indicating danger) around text items where you give advice about dangers and common mistakes. That way it is easy for people like me to browse through this faster and for newbs to remember.

    Thanks

  • A suggestion. In Break vs Return section, you can write the example like this:

    Correct me if I am wrong. I found this easier to understand. It may not.

  • Sorry…
    In my suggestion,

    should be:

  • In th "continue" section of this chapter, the first code sample is broken.
    In line 8, "iii" should be "count"

  • // continue loop example
    #include<iostream>
    using namespace std;

    int main()
    {
    for (int n=10; n>0; n-) {
       if  (n==5) continue;
       cout<< n << " , ";
    }
    cout <<"FIRE!\n";
    return 0;
    }
    WHAT IS THE OUTPUT?
    I’m having a difficult time running it what’s the problem with my program, thanks

    • Keith

      This won’t compile. Try replacing the n- in the for statement with n- or better still, -n, so it reads

      The expression n- doesn’t mean anything, it is the subtraction operator, so it is expecting you to provide another value to subtract from n. What you want is the decrement operator, n-.

      Once you’ve changed this, the output should be 10 , 9 ,  8 , 7 ,  6, 4 , 3 , 2 , 1 , FIRE!

      • Shiva

        Buddy, I think it is a problem with the comment formatter or something of this site, because your comment too is showing ‘n-‘ where you intended ‘n - -‘. I’ve seen it in other comments too. Even Alex seems to be experiencing such issues (with angle brackets, IIRC).

        It would be safer to put all our code inside the syntax highlighter using the [code] tags, which displays them alright. To type bits and pieces, there seems to be no other way than tweaking them (without affecting the intended meaning) as I’ve done above.

        Hope this helps someone.

  • Elpidius

    Typo in the second-to-last paragraph:
    "… understand what both what its intended use is …"
    One of the words, "what", should be removed.

  • Louis

    how can I turn back to the begining after the last case of switch?

  • required

    this program prints
    0 1 3 2 4 6 7 8 9 as well
    just wanted to mention. please don’t call me arrogant. 🙂

  • coprog2

    how to stop a running while loop. while running from 1-100. i need to stop at 20 by just pressing a key.
    Ex. output:
    int x=0
    while(x<100){
         _sleep(1000);
         cout<<x++<<endl;}

    • Alex

      There is no way that I’m aware of to do this in standard C++. A library like ncurses might be able to do something like this.

  • Why not? ‘break’ in any block, not only loop and switch…..

    • Alex

      I’m not sure why C++ doesn’t support this, as there are certainly cases where it would be useful to break out of any arbitrary block. There are a number of workarounds but none of them are great, as they obfuscate the intent of the programmer.

  • Nyap

    > This includes the for each loops included in C++11.
    we never covered those?

  • Consider this snippet for understanding the working mechanism of ‘break’ statement :

    int i,num;
    std::cin >> num;
    for(i=2;i<num;i++)
      {
        if(num%2==0)
          {
             std::cout << "a composite no.\n";
             break;
          }
    }
    if(i==num)
    std::cout << "a prime no.\n";

    The results on complation reflect that a single ‘break’ statement is able to break out two blocks at a time: the ‘if’ block plus the ‘ for’ block.

    I was expecting the break statement to work only for the inner block-the ‘if’ block and not for the ‘for’ block along with.

    • Alex

      Yes, thanks for pointing this out. As the lesson says:

      > The break statement causes a do, for, switch, or while statement to terminate.

      If statements don’t count. And as you’ve noticed, break works even if you’re in an inner block.

  • Darren

    I disagree with the use of break in the while loop. There is probably always a way to re-organise your code to remove any break or continue usage within a loop. For example, the code in your final example could be written with a do-while construct:

    Now admittedly this will print the first iteration output but it does gives you access to the character variable outside of the loop, which is something you probably want for a larger program. But arguing against my own point if break or continue do make the code easier to read, and there is no other legitimate way of doing things, then maybe they can be used. But with comments as to why.

    • Alex

      To me, it’s cleaner to explicitly break the loop than have char ch declared outside the loop and exposed beyond it (then I have to worry about whether it does anything -- I like my variables to go out of scope as soon as they’re no longer needed).

      There are definitely people who share your opinion -- and the related opinion that functions shouldn’t ever have an early return (only one return at the bottom). I disagree with that general philosophy. You should do whatever makes your code easiest to understand and maintain -- and often (but not always), use of break, continue, or return is the best choice for that.

      • Darren

        Fair point. I’m in complete agreement that code readability and code maintainability are paramount when programming.

        My point was that the example you gave was contrived to read better once you’d factored in the break, that doesn’t mean having a break (or continue) will necessarily make your code more clear; I think we’re in agreement on that point.  In my opinion if it is logical and performant to do so an early return statement is fine so long as the intent and outcome is clear, and commented if not.

Leave a Comment

Put C++ code inside [code][/code] tags to use the syntax highlighter

  

  

  

fourteen − 7 =