以下代码无法编译。
int n;
int x=1, n++; //compiler error
错误:在'++'标记之前预期'=',',',';','asm'或'属性'
如果我们将x的声明分开,程序编译就好了。
int n, x;
x=1, n++;//no error
为什么会这样?
答案 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++
将被视为另一个标识符,但根据规则,标识符不能包含++
,因此编译器会引发错误。
标识符中唯一允许的特殊字符是下划线_
。
标识符是一系列非数字字符(包括下划线
_
,小写和大写拉丁字母以及其他字符)和数字,它们指定6.2.1中描述的一个或多个实体。小写和大写字母是不同的。标识符的最大长度没有特定限制。
和第4段说:
在转换阶段7中将预处理令牌转换为令牌时,如果预处理令牌可以转换为关键字或标识符,则会将其转换为关键字。
n++
无法在翻译阶段转换为关键字或标识符。