C#循环-中断与继续


797

在C#(随意回答其他语言)循环中,break和continue作为离开循环结构并进行下一次迭代的一种方式,有什么区别?

例:

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


8
continue;将停止处理当前数据,row并继续处理集合中的下一个数据 row。另一方面,break;foreach完全离开该语句,并且将永远不会处理其余的行。
杰普·斯蒂格·尼尔森

Answers:


1499

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

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


2
为什么他们周围没有括号继续存在-我知道没有他们就可以奏效,但是为什么呢?
George Willcox

52
@GeorgeWillcox我年轻,愚蠢的自我始终还没有学会使用牙套的价值。(它们是可选的在C#中包括单个语句,而不是把它们可以更容易地以后引进的错误也看。programmers.stackexchange.com/a/16530/6342
迈克尔葡萄汁

386

理解这一点的一种非常简单的方法是在每个关键字之后放置“ loop”一词。如果这些术语像日常用语一样被阅读,则现在有意义。

break 循环-循环中断并停止。

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


105

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

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

2
我注意到这里的许多循环都只使用标准for循环,但这是否适用于之前和之后测试的while循环?这种goto表示法使我相信这一点,但需要一些验证。
Daniel Park

1
@Daniel,对于WHILE循环,可以使用BREAK和CONTINUE,没问题。
阿米拉(Amila)

@DanielPark对于while(“ pre-tested”)和do- while(“ post-tested”),在continue;满足一条语句之后,将要发生的下一件事是对循环条件进行评估,以决定是否要执行其他迭代。当然,break;如果检查循环条件,则仅完全退出循环即可。因此,goto类比也有助于理解这一方面。
杰普·斯蒂格·尼尔森

37

过去我总是感到困惑,是应该使用break还是继续。这是帮助我记住的:

何时使用Break vs Continue?

  1. 休息 -就像分手一样。很难过,你们要分开了。循环退出。

打破

  1. 继续 -表示您今天要休息一下,明天再整理一下(即跳过当前迭代)!

继续


将与我的伴侣分享。可能是“继续”应重命名为GetOverIt,而“中断”应重命名为MoveOnForward。难怪我们被称为极客,《 Break》如何有意义?听起来是破坏性的。而需要添加的一个是-STOP,甚至更好的EndIt-将修复许多错误,并使C尖锐真正地清晰。
麦克

再次陷入洪灾那是一次古老的旅程,所以我犯了一个大错误,尝试以我的方式见识它
Talal Zahid

@TalalZahid我不明白吗?
BKSpurgeon

28

breakforeach完全停止循环,continue跳至next DataRow


20

有很多人不喜欢breakcontinue。我最近看到的关于它们的投诉是JavaScript: Douglas Crockford撰写的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时出现中断时,将不会显示3 [Printed]和4 [Printed]

//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时,因为继续显示,所以不会显示3 [Printed]


7

打破

中断会强制循环立即退出。

继续

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


1
继续也检查循环条件:)
授予

1
Continue不是的反义词breakbreak停止循环,continue停止当前迭代。
史蒂文

6

简单答案:

Break立即退出循环。
继续开始处理下一个项目。(如果有,请跳转至for / while的评估行)


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并停止。

将中断替换为继续。

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

    Console.WriteLine(i);
}

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

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


5

不幸的是,Ruby有点不同。PS:对此我的记忆有些模糊,如果我错了,我深表歉意

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

循环(像其他所有循环一样)是表达式,并“返回”它们所做的最后一件事。大多数时候,从循环中获取返回值是没有意义的,因此每个人都这样做

a = 5
while a < 10
    a + 1
end

但是,您可以这样做

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

但是,许多红宝石代码都通过使用块来“模拟”循环。典型的例子是

10.times do |x|
    puts x
end

人们通常希望以块的结果来做事,这就是混乱的地方。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很棒,但是它有一些糟糕的情况。这是我多年来使用它的第二糟糕的表现:-)


5

请让我指出显而易见的一点:请注意,既不添加break也不继续,将恢复您的程序;例如,我被困在某个错误中,然后将其记录下来,我想恢复处理,并且在下一行之间还有更多的代码任务,所以我让它彻底解决了。


3

为了完全脱离foreach循环,使用break

要转到循环中的下一个迭代,请使用continue

如果要遍历对象的集合(如数据表中的行)并且正在搜索特定的匹配项,则Break很有用,当找到该匹配项时,无需继续遍历其余行,因此您想中断出来。

当您在循环迭代中完成了所需的操作后,继续很有用。如果使用if,通常会继续


2

如果您不想使用break,只需以使迭代条件为假的方式增加I的值,并在下一次迭代时不执行循环即可。

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
}

0

至于其他语言:

'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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.