我正在阅读 C-Sharp 7.0 简而言之 - 约瑟夫·阿尔巴哈里, 在跳转语句部分,有一段类似
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i + " ");
}
输出为 : 1 3 5 7 9
但是当我评论如下的继续跳跃语句时
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
//continue; // continue with next iteration
Console.Write (i + " ");
}
输出为 : 0 2 4 6 8
有人可以解释继续语句如何影响循环流吗?
如果没有大括号,C# 将编译要在if
条件为真时执行的下一条语句。评论不是声明。这是最好始终包含大括号的主要原因之一,即使只有一个语句。
continue
告诉程序跳转到循环的开头并重新测试条件。在这种情况下,将跳过Console.Write
调用。
还有break
完全结束循环并且不重新测试条件。
我认为您的基本困惑与注释掉语句会完全删除该语句这一事实有关。它不会做出"什么都不做"的陈述,然后是if
的主体。
但是,我认为人们对continue
做什么也表示困惑。 理解这一点的一个好方法是将其简化为更简单的内容。
假设你有
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0)
continue;
Console.Write (i + " ");
}
让我们将其简化为一个更简单的程序,从某种意义上说,for
很复杂,while
不那么复杂。您的程序片段与以下内容相同:
{
int i = 0;
while (i < 10)
{
if ((i % 2) == 0)
goto DoTheLoopIncrement;
Console.Write (i + " ");
DoTheLoopIncrement:
++i;
}
}
这与
:{
int i = 0;
DoTheLoopTest:
if (i < 10)
goto DoTheLoopBody;
else
goto DoneTheLoop;
DoTheLoopBody:
{
if ((i % 2) == 0)
goto DoTheLoopIncrement;
Console.Write (i + " ");
DoTheLoopIncrement:
++i;
goto DoTheLoopTest;
}
}
DoneTheLoop:
...
请注意"goto"版本的阅读时间有多长,难度有多大。这就是为什么我们使用while
和for
.但你必须明白,这正是while
和for
和continue
为了理解他们的控制流而正在做的事情。 它们只是编写goto
的一种愉快方式.
现在:你明白break
是什么意思吗? 休息只是写goto DoneTheLoop
的一种愉快方式。
格式不佳:
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i + " ");
}
更好的格式:
// Output is : 1 3 5 7 9
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i + " ");
}
没有"继续":
// Output is : 0 2 4 6 8
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
// continue; // continue with next iteration
Console.Write (i + " ");
}
最佳格式:
// Output is : 1 3 5 7 9
for (int i = 0; i < 10; i++)
{
// If i is even,
if ((i % 2) == 0)
{
// continue with next iteration
continue;
}
Console.Write (i + " ");
}
Continue 将忽略循环内遵循的所有语句,并继续下一次迭代。