我有一个非常简单的代码,我在内部循环中使用break
:
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2)
break; //break here not it2, but it loop
NSLog(@"it=%d it2=%d", it, it2);
}
}
我收到一个输出:
it=0 it2=0, it=0 it2=1,
it=1 it2=0, it=1 it2=1,
it=2 it2=0, it=2 it2=1,
it=3 it2=0, it=3 it2=1,
it=4 it2=0, it=4 it2=1
我知道在一些程序语言中,有可能确定哪个循环中断语句应该影响。是否可以调用break
来停止外部循环(for
和it
变量?
答案 0 :(得分:11)
如果你真的想这样做,那就咬紧牙关并使用goto
。
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2)
goto end_outer_loop;
NSLog(@"it=%d it2=%d", it, it2);
}
}
end_outer_loop:
// more stuff here.
这是合法的goto
(向下方向的大部分都是)。事实上,break
是一种特殊的&#34;已批准的&#34; goto,因为C是一种最小的语言,你必须在复杂的情况下使用显式的goto。
然而这里有很多人指出,如果你能使用return.
会更好。你不应该扭曲你的程序只是为了避免转到,但在大多数情况下,这是一个线索,你的功能变得太复杂,因此应该分解。
答案 1 :(得分:5)
您可以使用bool flag
来达到目的,例如:
bool flag = false;
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2) { flag=true; break; }
NSLog(@"it=%d it2=%d", it, it2);
}
if(flag) {break;}
}
仅当您不能使用其他人指定的return
方法时,才应使用此方法。 return
提高了代码可读性。这只是一种解决方法。
goto
方法也是有效方法,但建议不要使用goto
,因为它会破坏控制流,如果代码足够大,可能会导致数小时的调试!
答案 2 :(得分:1)
在C / C ++中,你真的没有这样的东西。显然已经有一些答案,例如使用goto
或其他东西。就个人而言,我不喜欢goto
和他们有点邋code的代码(IMO)。
对我来说,你有两个不错的选择。
写入循环条件,使它们包含两者中的退出条件。这是我亲自去的方式,因为我不喜欢在循环中使用break
或其他东西的想法,除非我绝对不得不这样做。我只是认为这样可以产生更清洁的产品,这就是我所教的内容。
如果您决定保留休息时间,那么不要使用单行if()
来控制它,而是将其分成两部分并创建一个&#34;中断标记&#34;如果满足中断条件,将设置。从那里,如果设置了该标志,则在外部循环中放置一个附加条件以退出,或者在外部循环内部(但不在内部循环内部)中设置另一个if()
,如果设置了该标志,则会中断。 / p>
希望这有帮助。
答案 3 :(得分:0)
您应该将循环包装在函数中,然后使用return
从该函数返回。
答案 4 :(得分:0)
在编程中使用goto语句会使程序的逻辑复杂而纠结。在现代编程中,goto语句被认为是一种有害的构造,也是一种糟糕的编程实践。
您可以将其用作功能,当条件发生时,功能退出
int loop(int it,int it2)
{
for (int it=0; it<5; it++) {
for (int it2=0; it2<5; it2++) {
if (it2==2) return 0; //function returns here
NSLog(@"it=%d it2=%d", it, it2);
}
}
return 1;
}
答案 5 :(得分:-1)
不幸的是,c ++并没有这种突破。被认为是可憎的可能性是使用goto。 有两种可接受的解决方案:
将此代码放在单独的函数中,并使用return
使用布尔标志
bool stopFlag = false; for(int it = 0; it&lt; 5&amp;&amp;!stopFlag; it ++) { for(int it2 = 0; it2&lt; 5; it2 ++) { 如果(无论如何) { stopFlag = TRUE; 打破; } }