If I use a break
statement, it will only break inner loop and I need to use some flag to break the outer loop. But if there are many nested loops, the code will
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; i++) {
if(condition) {
func(para1, para2...);
return;
}
}
}
func(para1, para2...) {
stmt2;
}
No, don't spoil the fun with a break
. This is the last remaining valid use of goto
;)
If not this then you could use flags to break out of deep nested loops.
Another approach to breaking out of a nested loop is to factor out both loops into a separate function, and return from that function when you want to exit.
Summarized - to break out of nested loops:
goto
Couldn't resist including xkcd here :)
source
Goto's are considered harmful but as many people in the comments suggest it need not be. If used judiciously it can be a great tool. Anything used in moderation is fun.
Use:
if (condition) {
i = j = 1000;
break;
}
I think goto
will solve the problem
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if (condition) {
goto end;
}
}
}
end:
stmt2
i = 0;
do
{
for (int j = 0; j < 1000; j++) // by the way, your code uses i++ here!
{
if (condition)
{
break;
}
}
++i;
} while ((i < 1000) && !condition);
I note that the question is simply, "Is there any other way to break all of the loops?" I don't see any qualification but that it not be goto
, in particular the OP didn't ask for a good way. So, how about we longjmp
out of the inner loop? :-)
#include <stdio.h>
#include <setjmp.h>
int main(int argc, char* argv[]) {
int counter = 0;
jmp_buf look_ma_no_goto;
if (!setjmp(look_ma_no_goto)) {
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 1000; j++) {
if (i == 500 && j == 500) {
longjmp(look_ma_no_goto, 1);
}
counter++;
}
}
}
printf("counter=%d\n", counter);
}
The setjmp
function returns twice. The first time, it returns 0 and the program executes the nested for loops. Then when the both i
and j
are 500, it executes longjmp
, which causes setjmp
to return again with the value 1, skipping over the loop.
Not only will longjmp
get you out of nested loops, it works with nested functions too!