声明如何影响逗号运算符?

AIB*_*AIB 4 c compiler-errors

以下代码无法编译.

int n;
int x=1, n++; //compiler error
Run Code Online (Sandbox Code Playgroud)

错误:在'++'标记之前预期'=',',',';','asm'或' attribute '

如果我们将x的声明分开,程序编译就好了.

int n, x;
x=1, n++;//no error
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Yu *_*Hao 8

x=1,n++;
Run Code Online (Sandbox Code Playgroud)

是一个表达式语句,,这里是逗号运算符.然而,

int x=1,n++;
Run Code Online (Sandbox Code Playgroud)

是一个声明,而不是表达式,,这里不解释为逗号运算符.

C11§6.7声明

declaration:
    declaration-specifiers init-declarator-listopt ;
    static_assert-declaration

 declaration-specifiers:
    storage-class-specifier declaration-specifiersopt
    type-specifier declaration-specifiersopt
    type-qualifier declaration-specifiersopt
    function-specifier declaration-specifiersopt
    alignment-specifier declaration-specifiersopt

 init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator  // comma

 init-declarator:
    declarator
    declarator = initializer
Run Code Online (Sandbox Code Playgroud)

声明中的逗号只是一个分隔符.由于n++不是有效的init-declarator,编译器会报告错误.