【问题标题】:Why selection-statement allows using of ; expression-statement?为什么选择语句允许使用 of ;表达式语句?
【发布时间】:2021-10-29 03:44:04
【问题描述】:

它允许这样的结构:

if (0);
if (0); else;

为什么允许这样的结构?

语法的简化会是原因吗?

【问题讨论】:

  • if(condition_that_is_far_less_readable_when_negated) ; else { logic }

标签: c if-statement expression language-lawyer grammar


【解决方案1】:

空语句的一些示例用例是:

所有工作都在封闭语句中完成:

// Count length of a string.
for (length = 0; buffer[length] != 0; ++length)
    ;

该案例是您希望在视觉上清晰的组织的一部分:

if      (parameter <  .3)
    CorrectVeryLow();
else if (parameter <  .9)
    CorrectLow();
else if (parameter < 1.1)
    ;
else if (parameter < 1.7)
    CorrectHigh();
else
    CorrectVeryHigh();

这种情况源于预处理器选择,有时有工作要做,有时没有:

#if FeatureTest
    #define InitializeSpecialFeature SetupSpecialFeature()
#else
    #define InitializeSpecialFeature
#endif

…

if (TimeToReset)
    InitializeSpecialFeature;

【讨论】:

    【解决方案2】:

    分号;可以单独用作空语句。

    这意味着

    if (0);
    

    等价于

    if (0)
    {
        // Empty
    }
    

    if (0); else;
    

    等价于

    if (0)
    {
        // Empty
    }
    else
    {
        // Also empty
    }
    

    【讨论】:

    • “1 空”可能很有用。 “2个空”有什么用?
    • @pmor :问自己这个问题;那是 youyour 问题中写的代码。然而,这个可能的用途是在一个有条件编译选择的表达式语句或空宏的宏中; null 语句是保持句法有效性所必需的。然而,这是一个不同的问题;如果您需要详细信息,请发布一个新问题。
    【解决方案3】:

    这里没有什么不寻常或异常的情况,特别是没有“语法简化”。这是完全一致的。这是什么构成“语句”的问题。语法是:

    if( <expression> ) <statement> [else <statement>]
    

    &lt;statement&gt; 有多种形式:

    statement:
     labeled-statement
     expression-statement
     compound-statement
     selection-statement
     iteration-statement
     jump-statement 
    

    但特别是expression-statement 是:

    expression-statement:
     expression(optional) ; 
    

    所以; 本身就是一个有效的表达式语句

    出于同样的原因,以下是一个有效且格式良好的 C 程序:

    int main()
    {
        ;;;;;;;;;;;;;
        return 0 ;
    }
    

    【讨论】:

    • if (0); else { /* logic */ } 很有用。 if (0); else; 有什么用处?
    • @pmor 我并不是说它有用 - 你提出了那个代码,而不是我!我只是在解释它在语法上的有效性。 validity != usefulness。 C 有一个简单的语法,可以让你做一些愚蠢的事情,但让编译器更容易实现。就像在自然口语中一样,语法上正确的构造仍然可以是语义无意义的。在某些情况下,该语句可能是在条件编译下解析为某事或什么都不做的宏。在这种情况下,null 语句对于在不同构建下保持句法有效性很有用。
    • C 有一个简单的语法,可以让你做一些愚蠢的事情,但让编译器更容易实现。:这就是我在“简化语法”下的意思"。
    • @pmor "simplification" 暗示了一个使事情变得更简单的积极过程。 C 一直很简单,没有任何东西被简化过。也许您的意思是“语法的简单性”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多