在 MSVC v9.0 上,如果我这样做:
int myvalue;
myvalue = true ? 1 : 0;
那么它似乎?:
是在'='之前评估的。这是保证吗?我使用此表作为参考:
http ://en.cppreference.com/w/cpp/language/operator_precedence
但是,两个运算符都在同一行,所以我不确定它们是否按照我期望的顺序进行评估,或者这是否得到标准的保证。任何人都可以澄清这一点吗?
在 MSVC v9.0 上,如果我这样做:
int myvalue;
myvalue = true ? 1 : 0;
那么它似乎?:
是在'='之前评估的。这是保证吗?我使用此表作为参考:
http ://en.cppreference.com/w/cpp/language/operator_precedence
但是,两个运算符都在同一行,所以我不确定它们是否按照我期望的顺序进行评估,或者这是否得到标准的保证。任何人都可以澄清这一点吗?
在这份声明中
int myvalue = true ? 1 : 0;
只有一个运算符,三元运算符。这里没有赋值运算符,所以优先级无关紧要。
不要将初始化与赋值混淆:
int myvalue;
myvalue = true ? 1 : 0; // now priorities are important
从您的链接:
同一单元格中的运算符(一个单元格中可能列出了几行运算符)在给定方向上以相同的优先级进行评估。例如,表达式 a=b=c 被解析为 a=(b=c),而不是 (a=b)=c,因为从右到左的关联性。
由于两者=
和?:
都在同一个单元格中并且具有从右到左的关联性,因此可以保证首先评估三元。
正如您链接的表中所写的那样,它们从右到左进行评估。它等价于:
int myvalue = (true ? 1 : 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++ 语言中得到保证