Can I use break to exit multiple nested for loops?
是否可以使用
不,不要用
AFAIK,C ++不支持命名循环,如Java和其他语言。您可以使用goto,或创建您使用的标志值。在每个循环结束时检查标志值。如果设置为true,那么您可以突破该迭代。
打破嵌套循环的另一种方法是将两个循环分解为单独的函数,并在要退出时将该函数的
当然,这提出了另一个论点,即你是否应该从最后的任何地方的函数中明确地
只是使用lambdas添加一个明确的答案:
1 2 3 4 5 6 7 8 9 | for (int i = 0; i < n1; ++i) { [&] { for (int j = 0; j < n2; ++j) { for (int k = 0; k < n3; ++k) { return; // yay we're breaking out of 2 loops here } } }(); } |
当然这种模式有一定的局限性,显然只有C ++ 11,但我认为它非常有用。
break将仅退出包含它的最内层循环。
你可以使用goto来打破任何数量的循环。
当然goto通常被认为是有害的。
is it proper to use the break function[...]?
使用break和goto会使得更难以推断程序的正确性。看到这里讨论:Dijkstra并不疯狂。
虽然这件衣服已经出现了,但我认为一个好方法是做到以下几点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | for(unsigned int z = 0; z < z_max; z++) { bool gotoMainLoop = false; for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++) { for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++) { //do your stuff if(condition) gotoMainLoop = true; } } } |
这个怎么样?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { //Some statement if (condition) { j=50; k=50; } } } } |
使用
1 2 3 4 | for (;;) for (;;) goto theEnd; theEnd: |
打破几个嵌套循环的一个好方法是将代码重构为函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void foo() { for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { // If condition is true return; } } } } |
goto对于破坏嵌套循环非常有帮助
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { for (k = 0; k < 1000; k++) { for (l = 0; l < 1000; l++){ .... if (condition) goto break_me_here; .... } } } } break_me_here: // Statements to be executed after code breaks at if condition |
The
break statement terminates the execution of the nearest enclosingdo ,for ,switch , orwhile statement in which it appears. Control passes to the statement that follows the terminated statement.
来自msdn。
我确实认为
要模拟
打破
1 2 3 4 5 6 7 8 9 | for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { goto theEnd; } } } theEnd: |
继续
1 2 3 4 5 6 7 8 9 10 | for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { i++; goto multiCont; } } multiCont: } |
只需一个
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 | bool check = true; for (unsigned int i = 0; i < 50; i++) { for (unsigned int j = 0; j < 50; j++) { for (unsigned int k = 0; k < 50; k++) { //Some statement if (condition) { check = false; break; } } if (!check) { break; } } if (!check) { break; } } |
在这段代码中,我们
我知道这是老帖子。但我建议有点逻辑和简单的答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 | for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < conditionj; j++) { for(unsigned int k=0; k< conditionk ; k++) { // If condition is true j= conditionj; break; } } } |
其他语言(如PHP)接受一个break参数(即break 2;)来指定你想要突破的嵌套循环级别的数量,但C ++却没有。您必须使用在循环之前设置为false的布尔值,如果要中断,在循环中设置为true,加上嵌套循环后的条件中断,检查布尔值是否设置为true并且如果是,则打破。
1 2 3 4 5 6 7 8 9 10 11 12 | while (i<n) { bool shouldBreakOuter = false; for (int j=i + 1; j<n; ++j) { if (someCondition) { shouldBreakOuter = true; } } if (shouldBreakOuter == true) break; } |
你可以使用try ... catch。
1 2 3 4 5 6 7 8 9 10 | try { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if(i*j == 42) throw 0; // this is something like"break 2" } } } catch(int e) {} // just do nothing // just continue with other code |
如果你必须同时打破几个循环,那么它通常是一个例外。
断开for循环对我来说有点奇怪,因为for循环的语义通常表明它将执行指定的次数。但是,在所有情况下都不错;如果你正在寻找一个集合中的东西,并想在你找到它之后破解它,那么它很有用。但是,在C ++中不可能打破嵌套循环;通过使用标记的中断,它是其他语言。你可以使用标签和goto,但这可能会让你在晚上胃灼热..?似乎是最好的选择。