如何在Objective-C中打破两个嵌套的for循环?

时间:2009-05-14 12:55:54

标签: c objective-c loops

我有两个这样嵌套的for循环:

for(...) {
    for(...) {

    }
}

我知道有一个break声明。但我很困惑,如果它打破了两个循环或只是它被调用的那个?一旦我发现迭代次数没有意义,我就需要打破这两个。

13 个答案:

答案 0 :(得分:106)

如果使用goto简化代码,那么它是合适的。

for (;;) 
{
    for (;;) 
    {
        break; /* breaks inner loop */
    } 
    for (;;) 
    {
        goto outer; /* breaks outer loop */
    }
} 
outer:;

答案 1 :(得分:91)

中断一个循环,但你可以在外循环中添加一个检查,当内部中断时它会中断。

bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
   for ( ... ) {
      if (...) {
         dobreak = true;
         break;
      }
   }
}

答案 2 :(得分:13)

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. */
    }
  }
}

答案 3 :(得分:9)

除了已经提到的标志变量或goto之外,你可以throw一个Objective-C例外:

@try {
  for() {
    for() {
       @throw ...
    }
  }
}
@catch{
  ...
}

答案 4 :(得分:7)

其他人已经提到了如何设置标记或使用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;
}

伪代码,未经测试,但你明白了。

答案 5 :(得分:2)

break语句只会跳出作用域的循环,即父循环。如果你想要突破第二个循环,你可以使用一个布尔变量,它在两个循环的范围内

bool isTerminated = false;

for (...)
{
    if (!isTerminated)
    {
        for(...)
        {
            ...

            isTerminated = true;
            break;
        }
    }
    else
    {
        break;
    }
}

答案 6 :(得分:2)

可能最简单的方法是使用“flag”变量

for(i=0; i<10 && (done==false); i++)
  for(j=0;j< 10; j++){
     ..
     ..
     if(...){done=true; break;}
  }

答案 7 :(得分:2)

在休息之前更改顶部循环计数器

for(i=0; i<10 ; i++)
  for(j=0;j< 10; j++){
     ..
     ..
     i = 10; 
     break;
  }

答案 8 :(得分:2)

另一个解决方案是在函数中分解出第二个循环:

int i;

for(i=0; i<10 ; i++){
    if !innerLoop(i) {
        break;
    }
}

bool innerLoop(int i)
    int j;
    for(j=0;j< 10; j++){
        doSomthing(i,j);
        if(endcondtion){
            return false;
        }
    }
}

答案 9 :(得分:1)

break语句突破了最里面的循环。需要一个额外的测试和中断语句来突破外部循环。

答案 10 :(得分:0)

如果从一组嵌套循环中执行中断,则仅终止执行中断的最内层循环。 (就像标准C一样)

答案 11 :(得分:0)

与最后一个完全一样,通常是这样的:

for(i=0;i<a;i++){  
 for(j=0;j<a;j++){
  if(Something_goes_wrong){
   i=a;
   break;
   }
 }
}

答案 12 :(得分:0)

只是为了咧嘴笑,如何将此真/假检查更改为方法并使用return语句:

- (bool) checkTrueFalse: parameters{

   for ( ...) {
      for ( ... ) {

         if (...) {
            return true;
         }

      }
   }
   return false;
}