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

时间:2015-08-20 05:29:44

标签: c compiler-errors

以下代码无法编译。

int n;
int x=1, n++; //compiler error
  

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

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

int n, x;
x=1, n++;//no error

为什么会这样?

2 个答案:

答案 0 :(得分:8)

x=1,n++;

是一个表达式语句,,这里是逗号运算符。但是,

int x=1,n++;

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

  

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

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

答案 1 :(得分:2)

int x=1,n++;中的逗号不是逗号运算符,而是逗号分隔符。 n++将被视为另一个标识符,但根据规则,标识符不能包含++,因此编译器会引发错误。
标识符中唯一允许的特殊字符是下划线_

C11:6.4.2.1(p2):

  

标识符是一系列非数字字符(包括下划线_,小写和大写拉丁字母以及其他字符)和数字,它们指定6.2.1中描述的一个或多个实体。小写和大写字母是不同的。标识符的最大长度没有特定限制。

和第4段说:

  

在转换阶段7中将预处理令牌转换为令牌时,如果预处理令牌可以转换为关键字或标识符,则会将其转换为关键字。

n++无法在翻译阶段转换为关键字或标识符。