C#循环-中断vs.继续

在C#(随意回答其他语言)循环中,breakcontinue作为离开循环结构并进入下一次迭代的手段有什么区别?

示例:

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

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

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,但循环将继续DoSomeThingWith将对i = 1i = 9执行。

理解这一点的一个非常简单的方法是将单词“循环”放在每个关键字之后。如果这些术语只是像日常短语一样阅读,它们现在就有意义了。

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

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

有很多人不喜欢breakcontinue。我最近看到的关于它们的抱怨是Douglas Crockford在JavaScript:好的部分中提出的。但我发现有时使用其中一个真的会简化事情,特别是如果你的语言不包括do-whiledo-until风格的循环。

我倾向于在搜索列表中的循环中使用break。一旦找到,继续下去就没有意义了,所以你最好退出。

我使用continue来处理列表中的大多数元素,但仍然想跳过一些。

当轮询某人或某事的有效响应时,break语句也很有用。而不是:

Ask a questionWhile the answer is invalid:Ask the question

您可以消除一些重复并使用:

While True:Ask a questionIf the answer is valid:break

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

Do:Ask a questionUntil the answer is valid

没有重复,也不需要break

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

而不是关掉/继续,它有打破/下,这在循环方面表现相同

循环(和其他所有东西一样)是表达式,它们最后做的是“返回”。大多数时候,从循环中获取返回值是毫无意义的,所以每个人都只是这样做

a = 5while a < 10a + 1end

但是你可以这样做

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

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

10.times do |x|puts xend

由于人们想要用块的结果做事情要常见得多,这就是它变得混乱的地方。

Brep会跳出调用块的代码

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

def timesten10.times{ |t| puts yield t }end

timesten do |x|x * 2end# will print2468 ... and so on

timesten do |x|breakx * 2end# 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 5x * 2end# 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 5x * 2end# this would print555 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

所以是的。Ruby很棒,但它有一些可怕的角落案例。这是我多年来使用它见过的第二个最差的:-)

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

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

简单的回答:

打破立即退出循环。
继续开始处理下一个项目。(如果有,通过跳转到for/time的评估行)

请让我声明一个显而易见的事实:请注意,既不添加中断也不添加继续,将恢复您的程序;即我被困在某个错误中,然后在记录它之后,我想恢复处理,并且在下一行之间有更多的代码任务,所以我只是让它失败了。

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

// break statementfor (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[打印]和4[打印]不会显示,因为i==3时有中断

//continue statementfor (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时有继续

为了完全打破一个Foreach循环,使用打破

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

如果您正在循环遍历对象的集合(例如可数据表中的行)并且正在搜索特定的匹配项,那么打破很有用,当您找到该匹配项时,无需继续遍历其余行,因此您想打破。

当你完成了循环迭代所需的内容时,继续很有用。你通常会在如果之后有继续

打破

Break强制一个循环立即退出。

继续

这样做的结果正好相反。它不会终止循环,而是立即再次循环,跳过其余的代码。

举个例子

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跳到下一次迭代。

如果你不想使用打破,你只需增加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}

什么时候使用中断vs继续?

  1. 打破-我们永远离开循环。再见。

中断

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

继续

(老掉牙的故事\(澳大利亚)/但希望能帮助你记住)

至于其他语言:

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

由于此处编写的示例对于理解概念非常简单,我认为查看使用的继续语句中更多的实用版本也是一个好主意。例如:

如果已经输入了数字,我们会要求用户输入5个唯一的数字,我们会给他们一个错误,然后我们继续我们的程序。

static void Main(string[] args){var numbers = new List<int>();

while (numbers.Count < 5){            
Console.WriteLine("Enter 5 uniqe numbers:");var number = Convert.ToInt32(Console.ReadLine());


if (numbers.Contains(number)){Console.WriteLine("You have already entered" + number);continue;}


numbers.Add(number);}

numbers.Sort();

foreach(var number in numbers){Console.WriteLine(number);}

}

假设用户的输入是1,2,2,2,3,4,5.the输出结果是:

1,2,3,4,5

为什么?因为每次用户输入一个已经在列表中的数字时,我们的程序都会忽略它,并且不会将已经在列表中的数字添加到其中。现在,如果我们尝试相同的代码,但无续语句,假设用户的输入相同,即1,2,2,2,3,4,5。输出为:

1,2,2,2,3,4

为什么?因为没有继续语句让我们的程序知道它应该忽略已经输入的数字。

现在对于中断声明,我再次认为最好通过示例来显示。例如:

在这里,我们希望我们的程序不断要求用户输入一个数字。我们希望当用户键入“ok”时循环终止,并在最后计算所有先前输入的数字的总和并将其显示在控制台上。

这就是中断语句在这个例子中的用法:

{var sum = 0;while (true){Console.Write("Enter a number (or 'ok' to exit): ");var input = Console.ReadLine();
if (input.ToLower() == "ok")break;
sum += Convert.ToInt32(input);}Console.WriteLine("Sum of all numbers is: " + sum);}

程序会要求用户输入一个数字,直到用户输入“OK”,然后才会显示结果。为什么?

因为在到达需要的条件时,打破语句完成或停止正在进行的进程。

如果那里没有出路语句,程序将继续运行,当用户键入“ok”时不会发生任何事情。

我建议复制此代码并尝试删除或添加这些语句,然后自己查看更改。