简化这个是否有效......
if (bool_b) {
int_i1 = int_i3;
} else {
int_i2 = int_i3;
}
..进入以下?
(bool_b ? int_i1 : int_i2) = int_i3;
它似乎适用于我的编译器。但我认为draft C++11 standard: N3337说它无效:
- 条件表达式:
- 逻辑或表达
- 逻辑或表达?表达式:赋值表达式
- 赋值表达式:
- 条件表达式
- logical-or-expression assignment-operator initializer-clause
- 套上表达
如果我理解得很清楚,=
左侧的部分应该是 logical-or-expression 。但即使 logical-or-expression 是条件表达式,倒数也是假的。
答案 0 :(得分:4)
是的,如果三元运算符的两个备选方案都是相同类型的左值,则它是有效的。
N3242 5.16 / 4 :如果第二个和第三个操作数是相同值类别且具有相同类型的glvalues,则结果为 类型和值类别
三元运算符称为条件运算符。
Gramar方面:
以下gramar制作:
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
允许声明如下:
true ? b : a = 20; // yields b. if condition would be false, would yield a =20
true ? b = 11 : a = 21; // yields b=11
由于gramar表现良好,分配将仅限于其中一个分支
然而,如果我们考虑完整的gramar制作链:
assignment-expression:
logical-or-expression assignment-operator initializer-clause
...
logical-or-expression:
logical-and-expression
logical-or-expression || logical-and-expression
logical-and-expression:
inclusive-or-expression
logical-and-expression && inclusive-or-expression
...
primary-expression:
(expression)
...
所以你可以编写如下表达式:
(true ? a : b) = 10; // a and b are lvalues, a or be are set to 10 depending on the condition
答案 1 :(得分:1)
括号很重要,部分原因在于您注意到的语言细节。 bool_b ? int_i1 : int_i2
不是逻辑或表达式,但(bool_b ? int_i1 : int_i2)
是 primary-expression ,因此也是逻辑 - 或 - 表达