跳转语句continue影响C#中的for循环


how continue, the jump statement affects for loop in c#

我在读C-Sharp 7.0简而言之-约瑟夫·阿尔巴哈里,在跳转语句部分,有一个类似于

1
2
3
4
5
6
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

但是当我像下面这样评论ContinuJump语句时

1
2
3
4
5
6
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

有人能解释continue语句如何影响循环流吗?


我认为,你的基本困惑与这样一个事实有关:注释一个语句会完全删除该语句。它没有做出"什么都不做"的声明,这就是当时的if的主体。

然而,我认为对于continue所做的工作也有一种困惑。理解这一点的一个好方法是将其简化为更简单的内容。

假设你有

1
2
3
4
5
6
for (int i = 0; i < 10; i++)
{
  if ((i % 2) == 0)
    continue;
  Console.Write (i +"");
}

让我们把它简化为一个更简单的程序,从这个意义上说,for比较复杂,while也比较简单。您的程序片段与以下内容相同:

1
2
3
4
5
6
7
8
9
10
11
{
  int i = 0;
  while (i < 10)
  {
    if ((i % 2) == 0)
      goto DoTheLoopIncrement;
    Console.Write (i +"");
    DoTheLoopIncrement:
    ++i;
  }
}

同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  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所做的,以便理解它们的控制流。它们只是一种写书的愉快方式。

现在:你明白break的意思吗?休息只是写《江户记》的一种愉快的方式。


如果没有大括号,C_将编译下一条语句,以便在if的条件为真时执行。注释不是语句。这是一个主要的原因,它最好总是包括花括号,即使只有一个声明。

continue告诉程序跳到循环的开始并重新测试条件。在这种情况下,将跳过Console.Write调用。

还有一个break,它完全结束循环,不重新测试条件。


格式错误:

1
2
3
4
5
6
for (int i = 0; i < 10; i++)
{
if ((i % 2) == 0) // If i is even,
continue; // continue with next iteration
Console.Write (i +"");
}

更好的格式:

1
2
3
4
5
6
7
// 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 +"");
}

不使用"继续"功能:

1
2
3
4
5
6
7
// 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 +"");
}

最佳格式:

1
2
3
4
5
6
7
8
9
10
11
// 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将忽略循环内的所有语句,并继续下一个迭代。