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

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的定义包括很多不同的东西,包括blockempty_statement。事实上embedded_statement 可以是除labeled_statementdeclaration_statement 之外的所有类型的语句,所以这些是您不能在那里使用的唯一“语句”。例如while (true) var i = 42; 应该是非法的(但是您可以使用块)。在示例while (true) ; 中有一个empty_statement【参考方案2】:

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

这相当于

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

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

【讨论】:

【参考方案3】:

根据您链接到的答案肯定是空话。

来自that answer:

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

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

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

【讨论】:

以上是关于迭代语句后的语句终止符 (;) 运算符:结束迭代语句本身,还是一个不可见的空语句?的主要内容,如果未能解决你的问题,请参考以下文章

运算符及while初识

Python入门教程第20篇 continue语句

如何使用python语句跳出循环

python学习2

HSQL 迭代 FOR 语句不起作用

循环语句和列表