2009-02-27 53 views
11

任何人都可以告訴我這個劇組有什麼效果(除了設置happyNumber爲1337),如果有的話,如果沒有其他效果,我怎麼能寫這樣的代碼?這是一個編譯器錯誤,還是C++的一些「隱藏功能」?怎麼了static_cast與多個參數?

int happyNumber = static_cast<int>(123.456, TRUE, "WTF" , false , "IS" , NULL , "GOING" , 0xff , "ON???" , 1337); 

我很驚訝這會編譯。我發現它是通過一個錯誤,我無意中將第二個參數設置爲正在執行的表達式的函數調用。這導致了一個令人討厭的bug,其中的對象是從第二個參數轉換而來的,只用一個參數調用該函數。它編譯...而最初沒有咚......

我使用Microsoft Visual C++ 2008

+0

這是完全合法的,沒有錯誤。 – Anonymous 2009-02-27 09:58:01

+0

啊,是的,你是對的。這讓我很困惑,然後我知道它必須是一個編譯器錯誤 - 它不是)我以前從來沒有碰到過逗號運算符。 – Statement 2009-02-27 10:12:25

回答

30

靜態鑄有一個參數,但它的參數是一個表達式,表達式可以包括comma operator。逗號是要評估其副作用一次兩個或多個表達式的情況下使用,例如:

int i, j; 
for (i=0, j=0; i < 10; i++,j++) { 
    // do stuff 
} 

這有點有用的,因爲沒有它,你只能評價爲初始化,條件每一個表情,繼續for循環的一部分(或任何其他需要表達式的地方)。但它通常不會提供最清晰的代碼,而且語義很奇怪。正如你所觀察到的,一個以逗號分隔的序列評估它的最後一個表達式的值。