提问



在一个C#(随意回答其他语言)循环中,break和continue之间的区别是什么作为离开循环结构的手段,然后进入下一次迭代?


例:


foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}

最佳参考


break将完全退出循环,continue跳过当前迭代。


例如:


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

    DoSomeThingWith(i);
}


中断将导致循环在第一次迭代时退出 - DoSomeThingWith永远不会被执行。这里:


for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}


不会为i = 0执行DoSomeThingWith,但循环将继续i = 1i = 1执行i = 9

其它参考1


理解这一点的一个非常简单的方法是在每个关键字后面加上循环一词。如果他们只是像日常用语一样阅读,那么这些术语现在就有意义


break 循环 - 循环被破坏并停止。


continue 循环 - 循环继续执行下一次迭代。

其它参考2


break 会导致程序计数器跳出最内层循环的范围


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


像这样工作


for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;


继续跳转到循环结束。在for循环中,继续跳转到增量表达式。


for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}


像这样工作


for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

其它参考3


break将完全停止foreach循环,continue将跳到下一个DataRow

其它参考4


有不少人不喜欢breakcontinue。我看到的最新投诉是道格拉斯·克罗克福德的 JavaScript:The Good Parts 。但是我发现有时使用其中一个确实简化了事情,特别是如果你的语言没有包含do-whiledo-until样式的循环。


我倾向于在循环中使用break来搜索列表中的某些内容。一旦找到,继续没有意义,所以你不妨放弃。


我在使用列表的大多数元素做某事时使用continue,但仍想跳过几个。


当[[某人或某事物]]对有效回复进行轮询时,break语句也会派上用场。代替:


Ask a question
While the answer is invalid:
    Ask the question


你可以消除一些重复和使用:


While True:
    Ask a question
    If the answer is valid:
        break


我之前提到的do-until循环是针对该特定问题的更优雅的解决方案:


Do:
    Ask a question
    Until the answer is valid


没有重复,也没有break

其它参考5


所有人都给出了很好的解释。我仍然发布我的答案只是为了举例说明这是否有帮助。


// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}


这是输出:



  0 [[已打印]] 1 [[已打印]] 2 [[已打印]]



所以3 [[印刷]]&当i == 3时,4 [[打印]]不会显示为中断


//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}


这是输出:



  0 [[已打印]] 1 [[已打印]] 2 [[已打印]] 4 [[已打印]]



所以3 [[打印]]将不会显示,因为当i == 3时会继续显示

其它参考6


我以前总是混淆是否应该使用休息或继续。这有助于我记住:


何时使用break vs continue?




  1. 休息 - 就像分手一样。很遗憾,你们分手了。



[47]



  1. 继续 - 意味着你今天要休息并明天整理出来(即跳过当前的迭代)!



[48]

其它参考7





Break强制循环立即退出。


继续


这与休息相反。它不是终止循环,而是立即再次循环,跳过剩下的代码。

其它参考8


以身作则


foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}


打印1,2,3(在单独的行上)。


在i=2处添加中断条件


foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}


现在循环打印1并停止。


用继续替换休息。


foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}


现在循环打印1和3(跳过2)。


因此,break停止循环,而continue跳到下一次迭代。

其它参考9


不幸的是,Ruby有点不同。
PS:我的记忆有点模糊,如果我错了,请道歉


它不是break/continue,而是break/next,它在循环方面表现相同


循环(就像其他所有东西一样)是表达式,并返回他们做的最后一件事。大多数情况下,从循环中获取返回值是没有意义的,所以每个人都这样做


a = 5
while a < 10
    a + 1
end


但是你可以这样做


a = 5
b = while a < 10
    a + 1
end # b is now 10


但是,很多ruby代码通过使用块来模拟循环。
典型的例子是


10.times do |x|
    puts x
end


因为人们想要用块的结果来做事情更常见,这就是它变得混乱的地方。
break/next在块的上下文中表示不同的东西。


break会跳出调用块的代码


next将跳过块中的其余代码,并将您指定的内容返回给块的调用者。没有例子,这没有任何意义。


def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.


嗯是的。 Ruby很棒,但它有一些可怕的角落案例。这是我在使用它的过程中看到的第二个最糟糕的一个:-)

其它参考10


简单回答:


中断会立即退出循环。

继续开始处理下一个项目。 (如果有,通过跳转到for/while的评估行)

其它参考11


请让我说明显而易见的事项:请注意,既不添加也不继续,将恢复您的计划;即我陷入某个错误,然后在记录之后,我想恢复处理,并且在下一行之间有更多的代码任务,所以我让它落空。

其它参考12


为了彻底摆脱foreach循环,使用 break ;


要进入循环中的下一个迭代,使用继续;


如果您循环遍历一组对象(如数据表中的行)并且您正在搜索特定匹配项,那么中断非常有用,当您找到该匹配项时,无需继续执行其余操作行,所以你要爆发。


当您在循环迭代中完成所需的操作时,继续非常有用。在 if 之后,您通常会继续

其它参考13


如果你不想使用 break ,你只需增加I的值,使迭代条件为false,循环不会在下一次迭代时执行。


for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

其它参考14


至于其他语言:


'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next