2016-01-25 55 views

回答

3

表達

x= 5|(high == 1 ? y : high == 0 ? z:0); 

被評價爲

x= 5|(high == 1 ? y : (high == 0 ? z:0)); 

它有作爲的

if(high == 1) 
    x = 5|y; 
else if(high == 0) 
    x = 5|z; 
else 
    x = 5|0; 
+0

你會寫一行或'if/else if/else'版本嗎? – bolov

+0

@bolov;如果我必須編寫內聯函數或宏,那麼我將使用'?:'版本,否則使用'if/else if/else'。 – haccks

0

及其類似的效果喜歡

if(high == 1) 
    y; 
else if(high == 0) 
    z; 
else 
    0; 
0

C99 standard,節6.5.15.4:

第一個操作數進行評價;在它的 評估之後有一個序列點。第二個操作數僅在第一個操作數 與0不等於0時計算; 第三個操作數僅在 第一個比較等於0時才被評估;結果是第二個或第三個操作數(曾經評估過)的值,轉換爲下面描述的類型 。如果嘗試修改條件運算符 的結果或在下一個序列點之後訪問它,行爲是 未定義。

因爲操作數從左到右進行求值,所以三元運算符的第二個實例(全部三個部分)成爲第一個三元運算符的第三部分中的表達式。

所以這個:

high == 1 ? y : high == 0 ? z:0 

是相同的:

(high == 1) ? y : ((high == 0) ? z:0)