三元和逗号运算符

时间:2016-11-01 21:56:29

标签: c++ c ternary-operator comma-operator

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。

为什么?

1 个答案:

答案 0 :(得分:8)

由于operator precedence逗号运算符的优先级最低),您的代码实际上看起来像

int a,b;
(a = 1 ? (1,2) : 3),4; // a = 2
(b = 0 ? (1,2) : 3),4; // b = 3

因此,根据三元条件规则,引用C11,章节§6.5.15

  

评估第一个操作数;它的评价和评价之间有一个序列点   评估第二或第三操作数(以评估者为准)。第二个操作数   仅当第一个比较不等于0时才计算;第三个操作数仅在以下情况下进行评估   第一个比较等于0;结果是第二个或第三个操作数的值   (无论哪个评估),转换为下述类型。 110)

     

[...]

     

110)条件表达式不会产生左值。

  • 对于第一种情况,将评估并返回第二个操作数。
  • 对于第二种情况,评估并返回第三个操作数。