在 C#(随意回答其他语言)循环中,break
和continue
作为离开循环结构并进入下一次迭代的手段有什么区别?
例子:
foreach (DataRow row in myTable.Rows)
{
if (someConditionEvalsToTrue)
{
break; //what's the difference between this and continue ?
//continue;
}
}
在 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);
}
不会执行DoSomeThingWith
for ,i = 0
但循环会继续DoSomeThingWith
执行 for i = 1
to i = 9
。
理解这一点的一个非常简单的方法是在每个关键字之后放置“循环”一词。如果这些术语只是像日常用语一样阅读,那么它们现在是有意义的。
break
loop - 循环中断并停止。
continue
loop - 循环继续执行下一次迭代。
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:;
}
break
会完全停止foreach
循环,continue
会跳到下一个DataRow
。
不喜欢break
和的人不止几个continue
。我看到的关于它们的最新投诉是 Douglas Crockford 的JavaScript: The Good Parts。但是我发现有时使用其中一个确实可以简化事情,尤其是如果您的语言不包含do-while
ordo-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
需要。
都给出了很好的解释。我仍然发布我的答案只是为了举例说明是否有帮助。
// 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[Printed] & 4[Printed] 不会显示,因为 i == 3 时有中断
//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[Printed] 不会显示,因为 i == 3 时有 continue
休息
Break 强制循环立即退出。
继续
这与break相反。它没有终止循环,而是立即再次循环,跳过其余代码。
简单的回答:
Break立即退出循环。
继续开始处理下一个项目。(如果有的话,通过跳转到 for/while 的评估行)
举例
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
跳到下一次迭代。
不幸的是,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 很棒,但它有一些可怕的极端情况。这是我多年来使用它时见过的第二个最差的 :-)
请让我说清楚:请注意,既不添加中断也不添加继续,将恢复您的程序;即我陷入了某个错误,然后在记录它之后,我想恢复处理,并且下一行之间还有更多的代码任务,所以我让它失败了。
要完全跳出 foreach 循环,使用break;
要进入循环中的下一个迭代,使用continue;
如果您正在循环遍历对象集合(如数据表中的行)并且您正在搜索特定匹配项,则Break很有用,当您找到该匹配项时,无需继续遍历剩余的行,因此您想要中断出去。
当您在循环迭代中完成了您需要做的事情时,继续很有用。你通常会在if之后继续。
如果您不想使用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
}
至于其他语言:
'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
由于此处编写的示例对于理解概念非常简单,我认为查看正在使用的continue 语句的更实用版本也是一个好主意。例如:
如果号码已经输入,我们要求用户输入 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。打印的结果是:
1,2,3,4,5
为什么?因为每次用户输入一个已经在列表中的数字时,我们的程序都会忽略它并且不会将列表中已经存在的内容添加到其中。现在,如果我们尝试相同的代码但没有 continue 语句,假设用户的输入相同,即 1、2、2、2、3、4、5。输出将是:
1,2,2,2,3,4
为什么?因为没有 continue 语句让我们的程序知道它应该忽略已经输入的数字。
现在对于Break 语句,我再次认为它是最好的例子。例如:
在这里,我们希望我们的程序不断要求用户输入一个数字。我们希望在用户输入“ok”时终止循环,并在最后计算所有先前输入的数字的总和并将其显示在控制台上。
这就是在本例中使用break 语句的方式:
{
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”,然后才会显示结果。为什么?因为 break 语句在达到所需条件时完成或停止正在进行的过程。
如果那里没有 break 语句,程序将继续运行,并且当用户键入“ok”时不会发生任何事情。
我建议复制此代码并尝试删除或添加这些语句并自己查看更改。