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