2012-06-01 34 views
0

我不能真正undersdand後綴。我知道它首先使用標識符,然後增加或減少,如第一個顯示i,然後++。但現在我認爲我錯了,仍然不明白。後綴改變之前標識符?

#include <iostream> 

using namespace std; 

int main() 
{ 
    int i = 0; 
    cout << i << i++ << i; 
    cout << "\n\n\nPress Enter to close the window . . . "; 
    cin.clear(); 
    cin.sync(); 
    cin.get(); 
    return 0; 
} 

輸出:

101 


Press Enter to close the window . . . 

第一i是增量readed.Why之前改變了嗎?

我預計

001 

Press Enter to close the window . . . 

誰能解釋。

+0

謝謝你去看看 –

+0

你是否真的在接受答案之前閱讀了標記副本中的任何答案?因爲你接受的答案顯然是不正確的。 –

回答

5

只是從來沒有做這樣的事情,這是不確定的

cout << i << i++ << i; 

做得更好

cout << i << i << (i + 1); 
i ++; 

如果你希望你預期的結果。


cout << i++; 

被定義的情況下和完全確定。

+0

不幸的是,這並不能解釋爲什麼和* undefined *。 – Walter

-1

我想什麼是undefined *)這裏是命令的函數參數的評估。什麼,你實際上是調用這裏的函數調用到(過載)

std::ostream& operator<< (std::ostream&, int); 

和第一個參數是另一個調用同一個函數的輸出,讓您的

cout << i << i++ << i; 

擴展到

operator<<(operator<<(operator<<(cout,i), i++), i); 

由於未指定函數參數的求值順序,因此可能會發生任何事情。您可避免通過編寫單獨的行:

cout << i; 
cout << i++; 
cout << i; 

其擴展到無害

operator<<(cout,i); 
operator<<(cout,i++); 
operator<<(cout,i); 

*)編輯:更準確地說,在cout<<i<<i++;不確定由於功能評價的順序參數未指定

+2

-1函數參數的評估順序不是未定義的,它是未指定的。未指定和未定義不一樣。另外,您的描述不能正確解釋爲什麼這是未定義行爲。檢查標記爲重複的答案,確切知道這是未定義的行爲。 –

+0

@Als你爲什麼批評我而不是編輯和正確?我認爲這個網站是爲了互相幫助,而不是比其他人更聰明的比賽。順便說一句,我顯然沒有遵循複製鏈接。 – Walter

+2

你是否期待我編輯和更正你的錯誤答案,當我已經非常詳細地回答了這個問題[here](http://stackoverflow.com/a/10782963/452307)因爲你不明白你應該問和解決你的疑惑不會發布不正確的答案。投票是一種手段,表明不正確或不滿的答案。我低估了你的答案,因爲它是不正確的。最後,如果你不能批評不發佈。僅供參考您的答案仍然不正確。 –