2

是否有效簡化這個...我可以爲C++中的條件表達式賦值嗎?

if (bool_b) { 
    int_i1 = int_i3; 
} else { 
    int_i2 = int_i3; 
} 

..into以下?

(bool_b ? int_i1 : int_i2) = int_i3; 

它似乎在我的編譯器上工作。但我認爲draft C++11 standard: N3337說,這是無效的:

  • 條件表達式:
    • 邏輯或表達
    • 邏輯或表達?表達式:賦值表達式
  • 賦值表達式:
    • 條件表達式
    • 邏輯或表達賦值操作者初始化子句
    • 擲表達

如果我理解的很好,左邊的部分應該是邏輯或表達式。但即使邏輯或表達式條件表達式 s,倒數是錯誤的。

回答

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示出井的assignement將被限制於所述一個分支

然而,如果我們考慮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 
+0

左值?你的意思是我不能'int i = f? 3:4',因爲整數文字是prvalues? – legends2k 2014-12-07 01:58:47

+0

@ legends2k「如果」,而不是「僅當」。三元運算符取第二個和第三個表達式的所有值類別。 – aschepler 2014-12-07 02:00:23

+0

@ legends2k我引用的問題是:'(bool_b?int_i1:int_i2)= int_i3;'如果'int_i1'和'int_i2'都是左值,則'有效。如果與文字混合,這是無效的:'(bool_b?int_i1:10)= int_i3;'是無效的,因爲條件不能確保爲分配返回一個左值。 – Christophe 2014-12-07 02:48:17

1

括號是重要的部分是因爲你注意到了語言的細節。 bool_b ? int_i1 : int_i2不是邏輯或表達式,但是(bool_b ? int_i1 : int_i2)主要表達式並且因此還有邏輯或表達式

+0

哦,我沒有考慮括號。謝謝。 – Oriol 2014-12-07 02:06:25

相關問題