如何继续,跳转语句会影响 C# 中的 FOR 循环



我正在阅读 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"版本的阅读时间有多长,难度有多大。这就是为什么我们使用whilefor.你必须明白,这正是whileforcontinue为了理解他们的控制流而正在做的事情。 它们只是编写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 将忽略循环内遵循的所有语句,并继续下一次迭代。

最新更新