2011-02-14 76 views
7

continuebreak有没有可能比当前运行的循环有更大的作用域?
在以下示例中,我希望在expr为true时继续外部for-loop,尽管它在内部for循环中调用,以便既不执行[some inner code]也不执行[some outer code]继续并以扩展范围破坏

for(int outerCounter=0;outerCounter<20;outerCounter++){ 
    for(int innerCounter=0;innerCounter<20;innerCounter++){ 
     if(expr){ 
     [continue outer]; // here I wish to continue on the outer loop  
     } 
     [some inner code] 
    } 
    [some outer code] 
} 

在上面

回答

11

您可以使用goto如果你绝对必须。不过,我通常采取两种方法之一:

  • 使内环一个单独的方法返回bool,这样我就可以从它返回,并表示外环应该做什么(休息,继续,或者做休息循环体
  • 的)保持一个单独的bool标志,其内循环之前设置,可被修改内循环,然后内环

这些方法中的被检查一世 一般更喜欢“提取法”的方法。

1

您可以使用goto语句,否则 - 不,和continue语句不支持此。

尽管goto语句被认为是不好的做法,这是唯一的原因退出一个超过for循环...它看起来这是要还的.NET

一部分
4

你的意思是原因像这样?

for(int outerCounter=0;outerCounter<20;outerCounter++){ 
    for(int innerCounter=0;innerCounter<20;innerCounter++){ 
     if(expr){ 
     runOuter = true; 
     break; 
     } 
     [some inner code] 
    } 
    if (!runOuter) { 
     [some outer code] 
    } 
    runOuter = false; 
} 
+1

它不会因为runOuter将是真实,[一些外码]只运行,如果runOuter是假的。这不是你想要的逻辑吗? – tzup 2011-02-14 13:50:14

+0

+1是的,谢谢,这是Jon Skeets发布的第二个版本。然而,我之前的评论与你的第一个答案没有解决问题有关。我删除了我的评论。 – HCL 2011-02-14 13:53:57

+0

@HCL,我刚刚意识到这一点。这很奇怪,你能看到这篇文章,因为我试图快速删除它,当我意识到我的错误,并发布更好的答案。无论如何,乔恩完全值得这个答案。 – tzup 2011-02-14 13:58:05

1

您可以使用goto语句标签:

for(int outerCounter=0;outerCounter<20;outerCounter++){ 
     for(int innerCounter=0;innerCounter<20;innerCounter++){ 
     if(expr){ 
      break; 
     } 
     [some inner code] 
     } 
     // You will come here after break 
     [some outer code] 
    }