【问题标题】: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(/语句)本身(在某种意义上),还是终止) 和终结者?

【问题讨论】:

    标签: c# iteration semantics


    【解决方案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 是那里提到的例外)。

      【讨论】:

        猜你喜欢
        • 2022-11-27
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 2020-12-24
        • 2022-01-23
        • 2011-10-22
        • 1970-01-01
        相关资源
        最近更新 更多