所以我在某处遇到了这个问题:
案例1:
int a;
a = 1, 2, 3;
printf("%d", a);
案例2:
int a = 1, 2, 3;
printf("%d", a);
解释说:
第二种情况给出错误,因为逗号用作分隔符,在第一种情况下=
优先于,
,因此基本上是(a=1), 2, 3
;
但我想问一下,为什么=
在案例 2 中不优先于,
?
这不仅仅是一个优先级问题,而是一个语言语法问题:两种情况下的=
不是同一个运算符:
-
在声明
int a = 1, 2, 3;
中,=
令牌引入了一个不能是逗号表达式的初始值设定项。,
结束初始值设定项,编译器发出错误2
因为这不是另一个变量的有效标识符。 -
在语句
a = 1, 2, 3;
中,a = 1, 2, 3
是一个表达式,解析为((a = 1), 2), 3
,因为它=
的优先级高于,
。=
是赋值运算符,其右侧是表达式,此赋值是逗号运算符的左操作数,
后跟常量表达式2
,a = 1, 2
其右操作数为3
的最终,
运算符的左操作数。该语句等价于((a = 1), 2), 3);
,简化为a = 1;
。
这个
int a = 1, 2, 3;/* not a valid one */
是错误的,因为由于=
具有更高的优先级,因此它在内部变得int a = 1
,并且没有2
的名称,3
这就是为什么此语句无效并导致编译时错误的原因。
为避免这种情况,您可能需要使用
int a = (1, 2, 3); /* evaluate all expression inside () from L->R and assign right most expression to a i.e a=3*/
而这里
int a;
a = 1,2,3;
有两个运算符=
和,
,请参阅man operator
。赋值运算符=
的优先级高于运算符comma
。所以它变得a=1
.
a = 1,2,3;
| L--->R(coma operator associativity)
this got assigned to a
例如
int x = 10, y = 20,z;
z = 100,200,y=30,0; /* solve all expression form L to R, but finally it becomes z=100*/
printf("x = %d y = %d z = %dn",x,y,z);/* x = 10, y = 30(not 20) z = 100 */
z = (100,200,y=30,0); /* solve all expression form L to R, but assign right most expression value to z*/
内部变量声明(如情况 1(逗号用于声明多个变量,例如:
int a,b=2,c=b+1,d; //here only b and c were initialized
C/C++ 中的语句可以是逗号分隔表达式的列表(这是情况 2 中发生的情况(:
a=b+1, c+=2, b++, d = a+b+c, 3, d; //these are expressions, remember one literal is an expression too!!!
注意:逗号(,(是一个编译时运算符,从我这边来说,
您可以遇到四种情况:
案例1
int a = 1, 2, 3; // invalid case cause too many initializers
案例2
int a = (1, 2, 3); // valid case
/* You can expand this line as a :
1;
2;
int a = 3;
*/
案例3
int a;
a = 1, 2, 3; // valid case
/* You can expand this line as a :
a = 1; // expression 1
2; // expression 2
3; // expression 3
*/
案例4
int a;
a = ( 1, 2, 3);// valid case
/* You can expand this line as a :
1; // expression 1
2; // expression 2
a = 3; // expression 3
*/
在上述情况下代替 1、2、3,我们可以在 C 中使用任何有效的表达式,探索更多!!