我无意中将一个while循环与另一个do while循环结合在一起,从而创建了这个令人困惑的结构:

do while (false)
{
    Console.WriteLine(1);
}
while (true);

这不会抛出任何错误,但也不会向控制台写入任何内容。事实上,它似乎什么也没做。

将其与这个常规的进行比较do while,它会1无限期地打印到控制台:

do
{
    Console.WriteLine(1);
}
while (true);

为什么第一个构造没有抛出错误?它在做什么?

4

  • 1
    它不会产生错误,但会产生警告,告诉您该行Console.WriteLine无法访问。警告是编译器表示“您编写的内容可以编译,但可能无法按预期执行”的方式。您应该学会注意警告,尤其是当如此少量的代码产生警告时。


    – 

  • 这就是人们应该学习 C# 中的块并省略单个语句块的原因之一:“亵渎!我们的代码惯例是始终使用块!”。许多人习惯于始终编写代码if(...) { },并且像你一样难以阅读和理解代码。然而,糟糕的格式又增加了一些混乱。


    – 


  • @Damien_The_Unbeliever,这里的警告只是巧合,有一个类似的令人困惑的代码,但没有警告。


    – 

  • 这两个语句都会产生无限循环,并且可能会导致计算机崩溃。


    – 


最佳答案
2

我将稍微重新整理一下您的样本。希望这能让您更清楚地了解正在发生的事情。

do
    while (false)
    {
        Console.WriteLine(1);
    }
while (true);

现在你明白了吗?归根结底是这样的:如果没有代码块({}),语句之后的第一个语句do将被解释为循环体。

在您的示例中,第一个语句是while (false)您意外声明的循环。由于内部循环现在是外部循环的主体,因此它会被重复while (true)– 也就是说,永远重复。

当然,由于false是 never true,所以该行Console.WriteLine(1);永远不会被执行。因此您的程序将永远循环,但它永远不会在控制台上打印任何内容。

第一个构造不会抛出错误,因为这是有效代码并且可以编译。它只是没有在逻辑上执行任何操作。

do while(false)将立即退出执行块,因此它不会打印任何内容。