逗号作为分隔符和运算符
Comma as a separator and operator
所以我在某处遇到了这个问题:
案例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 中使用任何有效的表达式,探索更多!!
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 逗号作为分隔符和运算符
- 逗号作为变量初始化中的分隔符(而不是运算符)
- qi%运算符使用(1)分隔符属性,(2)接受尾随分隔符
- 我可以在 c++ 中使用哪些正则表达式来解析分隔符、运算符、标识符和实数?
- 提取运算符是否删除分隔符
- 逗号运算符和逗号分隔符有什么区别?
- c++中的逗号运算符和逗号分隔符
- 为什么使用 ostream 运算符<<打印字符串时空格不充当分隔符?