为什么选择语句允许使用;表达式语句?

Why selection-statement allows using of ; expression-statement?

它允许这样的构造:

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

为什么允许这样的结构?

语法的简化会是原因吗?

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

也就是说

if (0);

相当于

if (0)
{
    // Empty
}

if (0); else;

相当于

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

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

工作全部在封闭语句中完成:

// 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;

这里没有发生任何不寻常或异常的事情,特别是没有“语法的简化”。这是完全一致的。这是什么构成“声明”的问题。语法是:

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

其中 <statement> 有多种形式:

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

但具体 expression-statement 是:

expression-statement:
 expression(optional) ; 

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

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

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