迭代语句之后的Statement-terminator(;)运算符:结束迭代语句本身,还是一个不可见的空语句?

时间:2017-10-18 22:18:45

标签: c# iteration semantics

this answer期间,我们心爱的Jon Skeet认为do {} while ()需要一个语句终结符,因为while()需要一个语句体,并继续举例说明:

  

while (true);(空语句)或while (true) {}(阻止语句)

......会有效。

第二个例子,事情非常简单; while循环执行复合(块)语句({}),它是空的。

然而,第一个例子和Skeet的描述一起引发了一个有趣的问题:

;(或任何其他迭代语句)中的while(true);是否会终止while(/ statement)本身(在某种意义上),或者它是否终止了一个实际的不可见空语句在)和终结者之间?

3 个答案:

答案 0 :(得分:3)

从语法的角度来看,它终止了这个陈述。尽管如此,这是一个非常古怪的想法。 while循环必须有一个正文,所以如果你只是写

while(true)

解析器不知道“语句”在哪里结束,因为它缺少一个令牌。您可以用另一个语句“终止”该语句。

while (true) i++;

;一样有效。你真正应该考虑的方式是写作

while (true) ;

真的是一个带有空语句的while循环,而不是试图想到“终止语句”

答案 1 :(得分:0)

用例就是如果你有while(something());它会执行something()直到它返回false。所以你不一定需要一个身体。

这等同于

while(true){
    if (something()) break;
}

您可以像await运算符一样使用它来等待操作。

答案 2 :(得分:0)

根据您的回答,它肯定是一个空洞的陈述。

来自that answer

  

每个表达式声明和声明声明的末尾都有一个分号。

     

iffor等语句不是表达式或声明语句。)

while似乎是相同的(除了do...while是一个例外,如前所述)。