2011-01-28 70 views
3

这里是我的代码的模式:继续;用于跳过许多循环

while (..) 
{ 
    for (...; ...;...) 
     for(...;...;...) 
      if () 
      { 
       ... 
       continue; 
      } 
} 

什么会做下去?他只会让第二个循环迭代一次,不是? 我希望能达到这个时间,有可能吗?

谢谢!

+1

你应该避免内循环可言,他们使代码不可读和高度容易出错。 – onof 2011-01-28 09:33:23

+0

@onof我不同意,至少部分。有时候“内部循环”真的是解决问题的最好方法(有时候另一种控制抽象或方法调用更好)。然而,我相信循环结构应该总是使用一个`{}`,因为它有助于缩进,并且避免了在循环中混淆内容 - 不在一个循环的问题。 – 2011-01-28 09:47:20

回答

5

在这里continue影响最近的环 - 你的第二个for。还有直接跳转到while的方法有两种:

  • goto,虽然有时是“有害”,这可以说是为什么它仍然存在
  • return

为了说明的主要原因后者:

while (..) 
{ 
    DoSomething(..); 
} 

void DoSomething(..) { 
    for (...; ...;...) 
     for(...;...;...) 
      if () 
      { 
      ... 
      return; 
      } 
} 

和前者:

while (..) 
{ 
    for (...; ...;...) 
     for(...;...;...) 
      if () 
      { 
       ... 
       goto continueWhile; 
      } 
    continueWhile: 
     { } // needs to be something after a label 
} 
+0

我认为这是我需要;) 非常感谢!据我所知,不应该使用转到 – Flo 2011-01-28 10:10:31

0

只有continue语句不可能。继续和断开语句只影响它们嵌套的最内层循环。

您可以设置一个变量并在外部循环中检查它。或者在for语句中重新组织IF语句和break条件。

while (..) 
{ 
    for (...; ...;...) 
    { 
     for(...;...;...) 
      if () 
      { 
       ... 
       skipLoop = true 
      } 
     if (skipLoop) 
      continue; 
    } 
} 

希望这有助于!

+0

噢:( 我希望有一种方式存在,但...顺便说一句,谢谢;) – Flo 2011-01-28 09:25:56

1

不可能直接为continue;不仅延续当前循环的执行,去外环你能做的唯一的事情就是设置一些标志,并检查它在外环

1

continuebreak始终是最内环,其接受一个continuebreak。在这种情况下,它是代码中最低的for循环。

2
while (..) 
{ 
    for (...; ...;...) 
     for(...;...;...) 
      if () 
      { 
       ... 
       goto superpoint; 
      } 
superpoint: 
//dosomething 
} 
2

您应该设置一个变量来确定何时需要离开循环。

while (..) 
{ 
    bool goToWhile = false; 

    for (...; ... && !goToWhile; ...) 
     for (...; ... && !goToWhile; ...) 
      if () 
      { 
       ... 
       goToWhile = true; 
      } 
} 

拿出更好的名字虽然;)