在C ++中,条件运算符中逗号运算符的优先级是什么?

时间:2012-08-27 04:15:02

标签: c++ comma operator-precedence

这里发生了什么?

#include <iostream>
using namespace std;

int main(){

    int x=0,y=0;
    true? ++x, ++y : --x, --y; 
    cout << "x: " << x << endl;
    cout << "y: " << y << endl; //why does y=0 here?

    x=0,y=0;
    false ? ++x, ++y : --x, --y; 
    cout << "x: " << x << endl;
    cout << "y: " << y << endl;
}

x: 1
y: 0

x: -1
y: -1

第二种情况似乎很好。我希望x和y在第一种情况下增加到1,但只有左手操作数增加。

3 个答案:

答案 0 :(得分:20)

第一个相当于:

(true  ? (++x, ++y) : (--x)), --y; 

第二个相当于:

(false ? (++x, ++y) : (--x)), --y; 

因此总是执行--y。在第一行中,首先执行增量,因此需要x = 1, y = 0。在第二行中,首先执行x的递减,因此预期x = -1, y = -1


Barmar的评论(另一个答案)中所述:

  

如果有人想知道为什么++x++y之间的逗号没有相同的效果,那是因为(true? ++x)根本不起作用。因此编译器会一直扫描,直到找到:,但超出此范围时,它会在到达较低优先级的运算符 [(此示例中为,)或语句结束时停止

答案 1 :(得分:4)

y为零,因为逗号有the lowest precedence among all C++ operators。由于其优先级低于三元条件运算符的优先级,因此条件运算符被解析为true? ++x, ++y : --xfalse? ++x, ++y : --x。在这两种情况下,--y语句都无条件地执行

编辑第一个逗号是不同的,因为编译器找到了?,所以现在需要:来完成条件的“when true”表达式。这就是为什么++x++y都被接纳的原因。

答案 2 :(得分:0)

阅读标准

  

§5.18逗号运算符[expr.comma]

     

¶1逗号运算符从左到右分组。

expression:
assignment-expression
expression , assignment-expression
     

用逗号分隔的一对表达式从左到右进行评估;左表达式是一个废弃值   表达式(第5条)。 83 与左表达式相关的每个值计算和副作用   在每个值计算和与右表达式相关的副作用之前进行排序。类型   结果的值是右操作数的类型和值;结果具有相同的值类别   作为右操作数,如果右操作数是glvalue和位域,则为位字段。

     

¶2在逗号被赋予特殊含义的上下文中,[示例:在函数的参数列表中(5.2.2)   和初始化程序列表(8.5) - 例子]第5章中描述的逗号运算符只能出现   在括号内。 [例如:

f(a, (t=3, t+2), c);
     

有三个参数,第二个参数的值为5. -end example]