逗号作为分隔符和运算符

Comma as a separator and operator

本文关键字:运算符 分隔符      更新时间:2023-10-16

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

案例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,因为它=的优先级高于,=是赋值运算符,其右侧是表达式,此赋值是逗号运算符的左操作数,后跟常量表达式2a = 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 中使用任何有效的表达式,探索更多!!