C 为什么使用逗号运算符初始化具有多个值的变量是错误的?

C 为什么使用逗号运算符初始化具有多个值的变量是错误的?,c,C,如果我写声明 int i=1,2,3; 为什么这里逗号充当分隔符而不是运算符,因为逗号运算符从左到右具有关联性,所以根据我的说法,第一个值是使用i=1初始化的,但它不是这样工作的,这背后的原因是什么?因为C语言语法规定初始值设定项必须是赋值表达式。后者包括除由其他两个表达式和逗号运算符组成的表达式以外的所有表达式: expression : assignment-expression expression , assignment-expression 因此,0,1,2不是i

如果我写声明

int i=1,2,3;

为什么这里逗号充当分隔符而不是运算符,因为逗号运算符从左到右具有关联性,所以根据我的说法,第一个值是使用
i=1
初始化的,但它不是这样工作的,这背后的原因是什么?

因为C语言语法规定初始值设定项必须是赋值表达式。后者包括除由其他两个表达式和逗号运算符组成的表达式以外的所有表达式:

expression :
    assignment-expression
    expression , assignment-expression
因此,
0,1,2
不是
i
的有效初始值设定项。由于
1
也不是有效的声明符,因此此代码与任何语法规则都不匹配,从而导致语法错误


我猜语法是特意这样设计的,以避免出现分隔符和运算符之间逗号不明确的情况。

参见
int I=1,2,3
将不会编译。@rakeb.void是的,这就是类似表达式的问题所在,比如
int i=3,y将是不明确的:它是将y声明为int还是初始化的一部分?