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

Statement-terminator (;) operator after iteration statement: Ends the iteration statement itself, or an invisible empty statement?

this answer 期间,我们敬爱的 Jon Skeet 考虑了 do {} while () 需要语句终止符的情况,因为 while() 需要语句主体,并继续举例说明:

while (true); (empty statement) or while (true) {} (block statement)

...将是有效的。


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

然而,第一个例子连同双向飞碟的描述引发了一个有趣的问题:

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

从语法的角度来看,它终止了语句。不过,这是一种非常奇怪的思考方式。 while 循环必须有主体,所以如果你只写

while(true)

解析器不知道 "statement" 在哪里结束,因为它缺少一个标记。您可以类似地 "terminate" 该语句与另一个语句。

while (true) i++;

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

while (true) ;

真的是一个while循环,以空语句为主体,没想到什么"terminates the statement"

一个用例是如果你有 while(something()); 它会执行 something() 直到它 returns false。所以你不一定需要一个body.

这相当于

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

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

根据您链接到的答案,它肯定是一个空语句。

来自that answer

There's a semi-colon at the end of every expression statement and declaration statement.

(if, for etc statements aren't expression or declaration statements.)

while似乎是一样的(除了那里提到的do...while是一个例外)。