三元和赋值运算符优先级

时间:2012-10-10 15:51:48

标签: c++

在MSVC v9.0上,如果我这样做:

int myvalue;
myvalue = true ? 1 : 0;

然后似乎在'='之前评估?:。这是保证吗?我使用此表作为参考: http://en.cppreference.com/w/cpp/language/operator_precedence

但是,两个运算符都在同一行,所以我不确定它们是否按照我期望的顺序进行评估,或者是否由标准保证。任何人都可以澄清这个吗?

4 个答案:

答案 0 :(得分:7)

在本声明中

int myvalue = true ? 1 : 0;

只有一个运算符,即三元运算符。这里没有赋值运算符,所以优先级无关紧要。

不要将初始化与赋值混淆:

int myvalue;
myvalue = true ? 1 : 0; // now priorities are important

答案 1 :(得分:3)

从您的链接:

  

在给定方向上,使用相同的优先级评估位于同一单元格中的运算符(单元格中可能有多行运算符)。例如,表达式a = b = c被解析为a =(b = c),而不是(a = b)= c,因为从右到左的相关性。

由于=?:都在同一个单元格中且具有从右到左的关联性,因此保证三元数首先进行评估。

答案 2 :(得分:0)

它们从右到左进行评估,因为它写在您链接的表格中。它相当于:

int myvalue = (true ? 1 : 0);

答案 3 :(得分:0)

从右到左:

int myValue1 = 20, myValue2 = 30;

myValue1 = true ? 1 : 0; // which is the same as:
myValue1 = ((true) ? (1) : (0));

// myValue == 1 && myValue2 == 30

true ? myValue1 : myValue2 = 5; // which is the same as:
(true) ? (myValue1) : ((myValue2) = (5));

// myValue == 1 && myValue2 == 30

false ? myValue1 : myValue2 = 5; // which is the same as:
(false) ? (myValue1) : ((myValue2) = (5));

// myValue == 1 && myValue2 == 5

这在C ++语言中得到了保证