2017-01-09 88 views
-1

這是三元運算符:(statement)?(if true):(if false)對不對?在三元運算符中,可以以真值執行兩個操作數嗎?

但爲什麼此代碼無法正常工作?

int a=10, b=20; 
(a<b)? a++, b++ : a--, b--; 
+0

運算符優先級...看看它。下次再定義*。 – LogicStuff

+5

[C++中條件運算符中逗號運算符的優先級是什麼?](可能是C++中條件運算符的優先級是什麼?)(http://stackoverflow.com/questions/12136156/whats-the-precedence-of-comma-operator-inside-conditional-operator-in -c) – LogicStuff

+1

像這樣寫一個三元組只會導致混淆,並且寫起來比簡單的'else-if'更可讀或更快,因爲每個結果都有兩個分配。基本上,你需要包括括號,儘管你不應該寫第一個三元組(imo)。 – George

回答

3

逗號運算符比三元運算符的精度要低。由於結腸不能成爲孤兒,因此你可以用第一個逗號而不是第二個逗號。

((a<b)? a++, b++ : a--), b--; 

您需要使用圓括號來組合至少第二個逗號表達式,爲了便於閱讀,我會做兩個:

(a<b)? (a++, b++) : (a--, b--); 
+0

謝謝。我知道了! – user7394178

2

條件運算符是因爲編譯器是理解你的代碼C++定義像

conditional-expression: 
    logical-or-expression 
    logical-or-expression ? expression : assignment-expression 

所以這個表達式語句

(a<b)? a++, b++ : a--, b--; 

相當於

((a<b)? a++, b++ : a--), b--; 

因爲賦值表達式具有比逗號表達更高的優先級。

你應該寫至少像

(a<b)? a++, b++ : (a--, b--); 

或爲了清楚像

(a < b)? (a++, b++) : (a--, b--); 

要考慮到有在C條件運算++和C.在條件運營商之間的差C條件運算符被定義爲類似於

conditional-expression: 
    logical-OR-expression 
    logical-OR-expression ? expression : conditional-expression 

它意味着用於例子Ë此記錄用C+++

(a < b)? a = b : b = a; 

相當於

((a < b)? a = b : b = a); 

而在C這個記錄就相當於

((a < b)? a = b : b) = a; 

和C編譯器將發出錯誤。

在另一方面,這紀錄C++

((a < b)? a = b : b) = a; 

是有效的。:)再次

+0

謝謝。我知道了! – user7394178

相關問題