我有两个这样嵌套的for循环:
for(...) { for(...) { } }
我知道有一个break
声明.但我很困惑,如果它打破了两个循环或只是它被调用的那个?一旦我发现重复迭代次数没有意义,我需要打破这两个.
如果使用goto简化代码,那么它是合适的.
for (;;) { for (;;) { break; /* breaks inner loop */ } for (;;) { goto outer; /* breaks outer loop */ } } outer:;
break中断了一个循环,但你可以在外循环中添加一个检查,当内部中断时它会中断.
bool dobreak = false; for ( ..; !dobreak && ..; .. ) { for ( ... ) { if (...) { dobreak = true; break; } } }
该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之外,您可以抛出一个Objective-C异常:
@try { for() { for() { @throw ... } } } @catch{ ... }
其他人已经提到了如何设置标志或使用a 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; }
伪代码,未经测试,但你明白了.