所以我在某个地方遇到了这个问题:
情况1:
int a;
a = 1, 2, 3;
printf("%d", a);
情况2:
int a = 1, 2, 3;
printf("%d", a);
解释说:
第二种情况下会出错,因为使用逗号作为分隔符;在第一种情况下,=
优先于,
,因此基本上是(a=1), 2, 3
;
但是我想问为什么案例2中的=
不优先于,
?
答案 0 :(得分:8)
这不仅是优先级的问题,还是语言语法的问题:两种情况下的=
不是同一运算符:
在声明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;
。
答案 1 :(得分:5)
此
Album object
是错误的,因为由于ArtistID
具有更高的优先级,所以它在内部成为Album
,并且没有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
答案 2 :(得分:4)
内部变量声明(如情况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!!!
答案 3 :(得分:2)
注意::逗号(,)是编译时间运算符,
从我的角度来看,他们是您遇到的四个案例:
案例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
*/
在上述情况下,我们可以在C中使用任何有效的表达式代替1,2,3,探索更多!!