2010-05-09 51 views
9

爲什麼這樣一句話:關於?和:在C++

int a = 7, b = 8, c = 0; 
c = b>a?a>b?a++:b++:a++?b++:a--; 
cout << c; 

不等於:

int a = 7, b = 8, c = 0; 
c = (b>a?(a>b?a++:b++):a++)?b++:a--; 
cout << c; 

,等於:

int a = 7, b = 8, c = 0; 
c = b>a?(a>b?a++:b++):(a++?b++:a--); 
cout << c; 

請給我一些原因。爲什麼?

+4

http://www.cppreference.com/wiki/operator_precedence – phimuemue 2010-05-09 11:52:44

+31

耶穌基督,爲什麼你曾經想要寫這樣的代碼?! – Skilldrick 2010-05-09 11:52:59

+0

你應該很好地用括號寫代碼,除非你知道優先級 – Zai 2010-05-09 12:08:30

回答

15

因爲? :是從右到左的關聯。它在語言中定義如此。

+0

你知道,我認爲你是對的,我錯了。我要刪除我的。 – 2010-05-09 12:02:26

+0

絕對正確。謝謝 – assembler 2010-05-09 18:03:36

7

我相信@sth提供了正確的答案,但是,我認爲@Skilldrick在評論中說得很對 - 爲什麼你會這樣寫這樣的東西。

除了優先級問題,在單個語句中增加相同變量時,您確實需要小心。聲明中可能有也可能沒有順序點,因此可能無法保證增量的評估順序。在同一編譯器中,您可能會得到不同編譯器的不同結果,甚至不同的優化設置。

+2

絕對 - 同一個序列點上同一個變量的多個增量是可怕的*未定義行爲*。這條線可能合法地等於其中任何一條。 – Stewart 2010-05-09 11:55:08

+0

一個? b:c有保證。 – 2010-05-09 11:56:02

+1

我可能會誤解,但不是'?:'那些確保評估順序的操作符之一,並且在評估操作符(其他是'','''&&','||'和可能一些其他)? – UncleBens 2010-05-09 11:56:23

1

運營商&&||?:在表達式中執行流控制。 ?:的行爲就像一個if-else語句。

c = b>a?a>b?a++:b++:a++?b++:a--; 

if (b>a) 
    if (a>b) 
     a ++; 
    else 
     b ++; 
else if (a ++) 
    b ++; 
else 
    a --; 

b>a? (
    a>b ? 
     a ++ 
    : 
     b ++ 
) : (a ++ ? 
    b ++ 
: 
    a -- 
) 

關聯是必要的行爲,如if … else if … else

有時候我用類似你們的語法序列比較的表達式:

operator<()(arr &l, arr &r) { 
    return l[0] < r[0]? true 
     : r[0] < l[0]? false 
     : l[1] < r[1]? true 
     : r[1] < l[1]? false 
     : l[2] < r[2]; 
} 
+0

不錯的提示。 +1謝謝 – assembler 2010-05-10 16:01:07