我有两个这样嵌套的for循环:
for(...) {
for(...) {
}
}
我知道有一个break
声明。但是我很困惑它是否打破了两个循环,或者只是打破了它被调用的那个循环?一旦发现重复进行多次没有意义,就需要将两者都打破。
Answers:
break打破了一个循环,但是您可以向外部循环添加一个检查,当内部破裂时,该检查会破裂。
bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
for ( ... ) {
if (...) {
dobreak = true;
break;
}
}
}
!dobreak
在错误的地方;它应该在有条件的(用于第二部分)中而不是在增量步骤(对于第三部分)中进行;我还将使用!dobreak && ..
,这样在打破时就不需要评估其他条件。我同意sigjuice:goto
正确使用它并不有害,在这种情况下goto
确实可以编写更好的代码。
break
了continue
声明。不过,这只是一些非显而易见的问题而值得担心。
该break
语句只会使您退出最内层的循环。如果您不希望在代码,内存和专用状态变量的性能方面增加开销,我建议将代码重构为自己的函数或方法,并使用它return
来摆脱所有循环:
void do_lots_of_work(void)
{
int i, j;
for(i=0; i<10 ; i++)
{
for(j=0;j< 10; j++)
{
..
..
if(disaster_struck())
return; /* Gets us out of the loops, and the function too. */
}
}
}
goto
。在任何实际使用中,对性能的关注也应该是不明显的。
除了已经提到的flag变量或goto之外,您还可以引发Objective-C异常:
@try {
for() {
for() {
@throw ...
}
}
}
@catch{
...
}
其他人提到了如何设置标志或使用goto
,但是我建议重构代码,以便将内部循环转换为单独的方法。然后,该方法可以返回一些标志,以指示外部循环应如此break
。如果适当地命名方法,则可读性更高。
for (int i = 0; i < 10; i++) {
if (timeToStop(i)) break;
}
-(bool) timeToStop: (int) i {
for (int j = 0; j < 10; j++) {
if (somethingBadHappens) return true;
}
return false;
}
伪代码,未经测试,但是您可以理解。
break语句跳出最内层的循环。要跳出外循环,还需要一条额外的test和break语句。