我可以在C ++中为条件表达式赋值吗?

时间:2014-12-07 01:49:30

标签: c++ language-lawyer ternary-operator assignment-operator conditional-operator

简化这个是否有效......

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 条件表达式,倒数也是假的。

2 个答案:

答案 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 ,因此也是逻辑 - 或 - 表达