1

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

int myvalue;
myvalue = true ? 1 : 0;

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

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

4

4 回答 4

7

在这份声明中

int myvalue = true ? 1 : 0;

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

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

int myvalue;
myvalue = true ? 1 : 0; // now priorities are important
于 2012-10-10T15:54:44.750 回答
3

从您的链接:

同一单元格中的运算符(一个单元格中可能列出了几行运算符)在给定方向上以相同的优先级进行评估。例如,表达式 a=b=c 被解析为 a=(b=c),而不是 (a=b)=c,因为从右到左的关联性。

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

于 2012-10-10T15:57:56.767 回答
0

正如您链接的表中所写的那样,它们从右到左进行评估。它等价于:

int myvalue = (true ? 1 : 0);
于 2012-10-10T15:53:18.753 回答
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++ 语言中得到保证

于 2012-10-10T16:02:03.677 回答