迭代语句后的语句终止符 (;) 运算符:结束迭代语句本身,还是一个不可见的空语句?
Posted
技术标签:
【中文标题】迭代语句后的语句终止符 (;) 运算符:结束迭代语句本身,还是一个不可见的空语句?【英文标题】:Statement-terminator (;) operator after iteration statement: Ends the iteration statement itself, or an invisible empty statement? 【发布时间】:2018-03-30 21:56:14 【问题描述】:在this answer 期间,我们心爱的 Jon Skeet 考虑了 do while ()
需要语句终止符的情况,因为 while()
需要语句体,并继续举例说明:
while (true);
(空语句)或while (true)
(块语句)
...应该是有效的。
第二个例子很简单;执行复合(块)语句()的while循环,它是空的。
然而,第一个例子,连同 Skeet 的描述,引发了我一个有趣的问题:
while(true);
(或任何其他迭代语句)中的;
是终止while
(/语句)本身(在某种意义上),还是终止)
和终结者?
【问题讨论】:
【参考方案1】:从语法的角度来看,它终止了语句。不过,这是一种非常奇怪的思考方式。 while
循环必须有一个主体,所以如果你只是写
while(true)
解析器不知道“语句”在哪里结束,因为它缺少一个标记。您可以类似地用另一个语句“终止”该语句。
while (true) i++;
与;
一样有效。你真正应该考虑的方式是写作
while (true) ;
真的是一个以空语句为主体的while循环,不去想什么“终止语句”
【讨论】:
语法?根据规范,while 语句由标记while
、(
、boolean_expression
、)
和 embedded_statement
组成。那么embedded_statement
的定义包括很多不同的东西,包括block
和empty_statement
。事实上embedded_statement
可以是除labeled_statement
和declaration_statement
之外的所有类型的语句,所以这些是您不能在那里使用的唯一“语句”。例如while (true) var i = 42;
应该是非法的(但是您可以使用块)。在示例while (true) ;
中有一个empty_statement
。【参考方案2】:
一个用例是如果你有while(something());
,它将执行something()
,直到它返回false。所以你不一定需要一个身体。
这相当于
while(true)
if (something()) break;
您可以像使用 await
运算符一样使用它来等待操作。
【讨论】:
【参考方案3】:根据您链接到的答案肯定是空话。
来自that answer:
每个表达式语句和声明语句的末尾都有一个分号。
(
if
、for
等语句不是表达式或声明语句。)
和while
似乎是一样的(除了do...while
是那里提到的例外)。
【讨论】:
以上是关于迭代语句后的语句终止符 (;) 运算符:结束迭代语句本身,还是一个不可见的空语句?的主要内容,如果未能解决你的问题,请参考以下文章