int a,b;
a = 1 ? 1,2 : 3,4; // a = 2
b = 0 ? 1,2 : 3,4; // b = 3
逗号操作符总是返回逗号的右侧,但如果对变量赋值,则返回左侧,除非使用()。那么第一个表达式是怎么得到2.
我看到它是a= 1,2所以它应该是1但实际上a=2
为什么?
由于运算符优先级(逗号运算符具有最低优先级),您的代码实际上看起来像
int a,b;
(a = 1 ? (1,2) : 3),4; // a = 2
(b = 0 ? (1,2) : 3),4; // b = 3
因此,根据三进制条件规则,引用C11
, chapter§6.5.15
计算第一个操作数;在它的求值和之间有一个序列点计算第二个或第三个操作数(以被计算的为准)。第二个操作数仅当第一个比较值不等于0时才计算;第三个操作数仅在以下条件下求值第一个比较等于0;结果是第二个或第三个操作数的值(以计算的值为准),转换为下面描述的类型。<一口> 110)一口>
[…]
110)条件表达式不产生左值
- 对于第一种情况,计算第二个操作数并返回。
- 对于第二种情况,计算第三个操作数并返回。