C#循环 - break与continue的区别

872

C#(欢迎回答其他语言)循环中,使用breakcontinue作为离开循环结构并进入下一次迭代的方式有什么区别?

例如:

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

2
博客文章总结以下内容:http://www.adamthings.com/post/2012/07/26/ensure-threads-have-finished-before-method-continues-in-c-using-thread-join/ - Adam
18
continue;会停止处理当前的行并继续处理集合中的下一行。另一方面,break;将完全离开foreach语句,并且剩余的行将永远不会被处理。 - Jeppe Stig Nielsen
16个回答

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

例如:

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

    DoSomeThingWith(i);
}

break语句会导致循环在第一次迭代时退出 - DoSomeThingWith 永远不会被执行。这里是代码:

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

    DoSomeThingWith(i);
}

i=0时不会执行DoSomeThingWith,但循环将继续DoSomeThingWith将被执行,直到i=1i=9


4
为什么continue周围没有括号-我知道它可以不用括号,但为什么? - George Willcox
65
@GeorgeWillcox 我年轻而幼稚的时候还没意识到总是使用大括号的重要性。(在C#中,对于单个语句,大括号是可选的,但不使用它们会更容易引入错误。同时请参见http://programmers.stackexchange.com/a/16530/6342) - Michael Stum

402

一个非常简单的理解方法是在每个关键字后面添加“loop”一词。如果只像日常短语那样阅读这些术语,现在就很好理解了。

break loop - 循环被打断并停止。

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


106

break语句会导致程序计数器跳出最内层循环的作用域。

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

如何工作

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

continue跳转到循环的末尾。在for循环中,continue跳转到增量表达式。

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:;
}

2
我注意到这里有许多循环只使用标准的 for 循环,但是这对于前置和后置测试的 while 循环是否有效呢?goto 符号使我相信可以,但需要一些验证。 - Daniel Park
1
@Daniel,对于WHILE循环,你可以使用BREAK和CONTINUE,没有问题。 - DbxD
1
@DanielPark 对于while(“预测试”)和do-while(“后测试”),在遇到continue;语句后,下一步将发生的事情是评估循环条件以决定是否要进行额外的迭代。当然,使用break;时不会检查循环条件,循环将完全退出。因此,goto类比也适用于理解这个方面。 - Jeppe Stig Nielsen

63

何时使用break和continue?

  1. Break - 我们永远离开循环并永远中止。再见。

Break

  • 继续 - 意味着你今天要休息一下,明天再整理好所有的事情(即跳过当前迭代)!
  • Continue

    (无聊的故事 ¯¯\(ツ)/¯¯ 和图片仅用于帮助您记住...希望您永远不会忘记)

    抱怨警告:

    不知道为什么要使用那些词。如果你想跳过迭代,为什么不使用“skip”这个词,而要使用“continue”呢?如果给出正确的名称,整个Stack Overflow问题和成千上万的开发人员都不会感到困惑。


    1
    我会和我的伙伴分享这个。可能需要将“Continue”重命名为“GetOverIt”,将“Break”重命名为“MoveOnForward”。难怪我们被称为极客,因为“Break”有什么意义?它听起来很破坏性。还应该添加一个-STOP,甚至更好的是EndIt-可以修复许多错误,使C#真正锋利。 - Mike
    再次进入洪水之中 同样的旅程,就像从前 所以我犯了一个大错误 试着按照我的方式看待它 - Talal Zahid

    30

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


    20

    有不少人不喜欢breakcontinue。我最近读到的一篇关于它们的抱怨来自Douglas Crockford的《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

    13

    所有人都给出了非常好的解释,我仍然发布我的答案,只是为了举个例子,如果可以帮助的话。

    // 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[已打印]

    因此,当i == 3时有break,所以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[已打印]

    因此,当i == 3时,由于使用了continue,所以不会显示3[已打印]。


    7

    Break(中断)

    Break会立即终止循环。

    Continue(继续)

    与break相反,continue会跳过当前循环的剩余代码,并立即进入下一次循环。


    1
    Continue 也会检查循环条件 :) - Grantly
    2
    “Continue”不是“break”的相反, “break”会停止循环,“continue”只会停止当前迭代。 - Steven

    6

    举个例子

    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,然后停止。 请使用continue替换break。
    foreach(var i in Enumerable.Range(1,3))
    {
        if (i == 2)
            continue;
    
        Console.WriteLine(i);
    }
    

    现在需要循环打印1和3(跳过2)。
    因此,break停止循环,而continue跳到下一次迭代。

    6

    简单回答:

    Break 立即退出循环。
    Continue 开始处理下一个项(如果有的话,通过跳转到 for/while 的评估行)。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接