2011-07-08 144 views
5

可能重複:
confused about printf() that contains prefix and postfix operators.printf使用堆棧?

我遇到與下面的代碼段代碼來了,

int main() { 
    int c = 100; 
    printf("\n %d \t %d \n", c, c++); 
    return 0; 
} 

我預計輸出爲100 & 101,但我得到的輸出as

101  100 

任何人都可以幫助我知道爲什麼?從右到左,從而第一C++

+0

我猜測代碼是以相反的順序來評估printf參數,因此首先插入來自「C++」參數的c,然後插入先前的c參數,然後該參數已經增加。 如果你想爲第二個值做1加c,並且增加c,我想你必須使用printf(「\ n%d \ t%d \ n」,c,c + 1)。 C++; –

回答

-3

printf的作品被執行(C = 100)C++執行和C = 101再經過 因此101和100是輸出 http://en.wikipedia.org/wiki/Printf

+2

-1。這是錯誤的。不能期望調用未定義行爲的結果是什麼。 –

+0

其不undefinef http://en.wikipedia.org/wiki/Printf閱讀維基atleast ..默認情況下,printf是正確對齊 – ashmish2

+2

@ ashmish2:你很混淆printf如何處理它的參數,以及參數如何「準備」在他們交給printf之前在呼叫地點。第二部分(函數調用中參數的評估順序)未由標準規定。 – Mat

5

沒有保證是否c左側,或右側的c++,將首先進行評估。

的功能參數評價的順序是Unspecifeid因此按照標準未定義行爲

作爲每部分C++標準 1.9:

「某些其它方面和抽象機的操作在本國際標準被描述爲unspecifiedfor example, order of evaluation of arguments to a function)可能時,本國際標準。定義了一組允許的行爲,它們定義了抽象機器的非確定性方面。「

+0

您的問題中有一個大膽的「未指定行爲」。但是這不是很有用,因爲行爲是不確定的。所以你應該至少有一個更大膽的「未定義行爲」。 –

9

C和C++標準並不保證函數參數的評估順序。大多數編譯器都會從右向左計算參數,因爲這是使用cdecl調用約定將它們壓入堆棧的順序。

+0

男人!如果是未定義的行爲,您必須在此快速回答這些「爲什麼我的程序會執行」類型的問題。 –

+0

http://en.wikipedia.org/wiki/Printf它不是undefined – ashmish2

+0

@ ashmish2:David Hammens評論中的''不是'printf'(它是一個明確定義的函數),而是'c,C++ 「論點。這是不明確的。關於這個主題請參閱前面的Q,http://stackoverflow.com/questions/3109475/confused-about-printf-that-c​​ontains-prefix-and-postfix-operators – MSalters

1

如果您剛剛使用printf ("%d\n", c++)printf ("%d\n", c),結果在任何情況下均爲100。在一次函數調用中同時打印c和C++是未定義的行爲