Break
Although you have already seen the break statement
in the context of switch statements
(7.4 -- Switch statement basics), it deserves a fuller treatment since it can be used with other types of loops as well. The break statement causes a while loop, do-while loop, for loop, or switch statement to end, with execution continuing with the next statement after the loop or switch being broken out of.
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 fallthrough into subsequent cases):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> void printMath(int x, int y, char ch) { switch (ch) { case '+': std::cout << x << " + " << y << " = " << x + y << '\n'; break; // don't fall-through to next case case '-': std::cout << x << " - " << y << " = " << x - y << '\n'; break; // don't fall-through to next case case '*': std::cout << x << " * " << y << " = " << x * y << '\n'; break; // don't fall-through to next case case '/': std::cout << x << " / " << y << " = " << x / y << '\n'; break; } } int main() { printMath(2, 3, '+'); return 0; } |
See lesson %Failed lesson reference, id XX% for more information about fallthrough, along with some additional examples.
Breaking a loop
In the context of a loop, a break statement can be used to end the loop early. Execution continues with the next statement after the end of the loop.
For example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> int main() { int sum{ 0 }; // Allow the user to enter up to 10 numbers for (int count{ 0 }; count < 10; ++count) { std::cout << "Enter a number to add, or 0 to exit: "; int num{}; std::cin >> num; // exit loop if user enters 0 if (num == 0) break; // exit the loop now // otherwise add number to our sum sum += num; } // execution will continue here after the break std::cout << "The sum of all the numbers you entered is: " << sum << "\n"; return 0; } |
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).
Here’s a sample execution of the above program:
Enter a number to add, or 0 to exit: 5 Enter a number to add, or 0 to exit: 2 Enter a number to add, or 0 to exit: 1 Enter a number to add, or 0 to exit: 0 The sum of all the numbers you entered is: 8
Break is also a common way to get out of an intentional infinite loop:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> int main() { while (true) // infinite loop { std::cout << "Enter 0 to exit or anything else to continue: "; int num{}; std::cin >> num; // exit loop if user enters 0 if (num == 0) break; } std::cout << "We're out!\n"; return 0; } |
A sample run of the above program:
Enter 0 to exit or anything else to continue: 5 Enter 0 to exit or anything else to continue: 3 Enter 0 to exit or anything else to continue: 0 We're out!
Break vs return
New programmers sometimes 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <iostream> int breakOrReturn() { while (true) // infinite loop { std::cout << "Enter 'b' to break or 'r' to return: "; char ch; std::cin >> ch; if (ch == 'b') break; // execution will continue at the first statement beyond the loop if (ch == 'r') return 1; // return will cause the function to immediately return to the caller (in this case, main()) } // breaking the loop causes execution to resume here std::cout << "We broke out of the loop\n"; return 0; } int main() { int returnValue{ breakOrReturn() }; std::cout << "Function breakOrReturn returned " << returnValue << '\n'; return 0; } |
Here are two runs of this program:
Enter 'b' to break or 'r' to return: r Function breakOrReturn returned 1
Enter 'b' to break or 'r' to return: b We broke out of the loop Function breakOrReturn returned 0
Continue
The continue statement provides a convenient way to end the current iteration of a loop without terminating the entire loop.
Here’s an example of using continue:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> int main() { for (int count{ 0 }; count < 10; ++count) { // if the number is divisible by 4, skip this iteration if ((count % 4) == 0) continue; // go to next iteration // If the number is not divisible by 4, keep going std::cout << count << std::endl; // The continue statement jumps to here } return 0; } |
This program prints all of the numbers from 0 to 9 that aren’t divisible by 4:
1 2 3 5 6 7 9
Continue statements
work by causing the current point of execution to jump to the bottom of the current loop.
In the case of a for loop, the end-statement of the for loop still executes after a continue (since this happens after the end of the loop body).
Be careful when using a continue statement
with while or do-while loops. These loops typically change the value of variables used in the condition inside the loop body. If use of a continue statement
causes these lines to be skipped, then the loop can become infinite!
Consider the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> int main() { int count{ 0 }; while (count < 10) { if (count == 5) continue; // jump to end of loop body std::cout << count << ' '; ++count; // this statement is never executed after count reaches 5 // The continue statement jumps to here } return 0; } |
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 continue
causes the execution to jump to the bottom of the loop. 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.
Of course, you already know that if you have an obvious counter variable, you should be using a for loop
, not a while
or do-while
loop.
The debate over use of break and continue
Many textbooks caution readers not to use break
and continue
in loops, 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> int main() { int count{ 0 }; // count how many times the loop iterates bool keepLooping { true }; // controls whether the loop ends or not while (keepLooping) { std::cout << "Enter 'e' to exit this loop or any other character to continue: "; char ch{}; std::cin >> ch; if (ch == 'e') keepLooping = false; else { ++count; std::cout << "We've iterated " << count << " times\n"; } } return 0; } |
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
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> int main() { int count{ 0 }; // count how many times the loop iterates while (true) // loop until user terminates { std::cout << "Enter 'e' to exit this loop or any other character to continue: "; char ch; std::cin >> ch; if (ch == 'e') break; ++count; std::cout << "We've iterated " << count << " times\n"; } return 0; } |
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 its value is changed), an else statement
, and a nested block.
Minimizing the number of variables used and keeping the number of nested blocks down both improve code comprehensibility more than a break
or continue
harms it. For that reason, we believe judicious use of break
or continue
is acceptable.
Best practice
Use break and continue when they simplify your loop logic.
![]() |
![]() |
![]() |
In th "continue" section of this chapter, the first code sample is broken.
In line 8, "iii" should be "count"
Thanks!
Sorry...
In my suggestion,
should be:
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.
I think this does help clarify the intent of each. I've updated the example accordingly.
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
Good idea. I'll look into it.
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 :)
Also fixed, I think.
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)
Fixed.
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.
GREAT TUTORIAL MASTER ALEX
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.
int iii=0;
while (iii < 10)
{
if (iii==5)
{
iii++;
continue;
}
cout << iii << " ";
iii++;
}
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: