逗号作为分隔符和运算符

时间:2018-07-01 04:03:31

标签: c++ c

所以我在某个地方遇到了这个问题:

情况1:

int a;
a = 1, 2, 3;
printf("%d", a);

情况2:

 int a = 1, 2, 3;
 printf("%d", a);

解释说:

第二种情况下会出错,因为使用逗号作为分隔符;在第一种情况下,=优先于,,因此基本上是(a=1), 2, 3;

但是我想问为什么案例2中的=不优先于,

4 个答案:

答案 0 :(得分:8)

这不仅是优先级的问题,还是语言语法的问题:两种情况下的=不是同一运算符:

  • 在声明int a = 1, 2, 3;中,=令牌引入了一个初始化程序,该初始化程序不能是逗号表达式。 ,结束初始化程序,编译器发出错误消息,因为2不是另一个变量的有效标识符。

  • 语句a = 1, 2, 3;中的
  • a = 1, 2, 3是一个表达式,被解析为((a = 1), 2), 3,因为=的优先级高于,=是赋值运算符,其右侧是一个表达式,此赋值是逗号运算符,的左操作数,后跟一个常量表达式2a = 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

有两个运算符3int 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,探索更多!!