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);
}
break语句会导致循环在第一次迭代时退出 - DoSomeThingWith
永远不会被执行。这里是代码:
for (int i = 0; i < 10; i++) {
if(i == 0) {
continue;
}
DoSomeThingWith(i);
}
当i=0时不会执行DoSomeThingWith
,但循环将继续,DoSomeThingWith
将被执行,直到i=1至i=9。
continue
周围没有括号-我知道它可以不用括号,但为什么? - George Willcox一个非常简单的理解方法是在每个关键字后面添加“loop”一词。如果只像日常短语那样阅读这些术语,现在就很好理解了。
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:;
}
for
循环,但是这对于前置和后置测试的 while
循环是否有效呢?goto
符号使我相信可以,但需要一些验证。 - Daniel Parkwhile
(“预测试”)和do
-while
(“后测试”),在遇到continue;
语句后,下一步将发生的事情是评估循环条件以决定是否要进行额外的迭代。当然,使用break;
时不会检查循环条件,循环将完全退出。因此,goto
类比也适用于理解这个方面。 - Jeppe Stig Nielsenbreak
会完全停止 foreach
循环,continue
会跳到下一个 DataRow
。
有不少人不喜欢break
和continue
。我最近读到的一篇关于它们的抱怨来自Douglas Crockford的《JavaScript: The Good Parts》。但是我发现,有时候使用其中之一确实可以简化事情,尤其是如果你的语言不包括do-while
或do-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[已打印]
因此,当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[已打印]。
Break(中断)
Break会立即终止循环。
Continue(继续)
与break相反,continue会跳过当前循环的剩余代码,并立即进入下一次循环。
举个例子
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);
}
foreach(var i in Enumerable.Range(1,3))
{
if (i == 2)
continue;
Console.WriteLine(i);
}
break
停止循环,而continue
跳到下一次迭代。简单回答:
Break 立即退出循环。
Continue 开始处理下一个项(如果有的话,通过跳转到 for/while 的评估行)。
continue;
会停止处理当前的行并继续处理集合中的下一行。另一方面,break;
将完全离开foreach
语句,并且剩余的行将永远不会被处理。 - Jeppe Stig Nielsen