2016-03-05 38 views
1

我無法理解下面的問題,同時預遞增,遞增后里面的printf變量: - 在turbocpp編譯器使用預增量,在MSDOS和DEVC++編譯器後增量結果差異

代碼: -

#include<stdio.h> 
main() 
{ 
int i=0; 
clrscr(); 
printf("%d %d %d",i,i++,++i); 
getch(); 
return(0); 
} 

在MSDOS編譯器的輸出是: - 2 1 1

但對於DEVC++ 5.11相同的程序輸出是: - 2 1 2

1)M理解是printf打印左邊的變量,然後右移(我用3個不同的變量對它進行了驗證)。那麼,根據那個輸出不應該是0 0 2?

2)I與DEVC++嘗試檢查同一節目的輸出,但它給了不同的結果。現在我真的很困惑,應該是輸出。

3)另外,如果我變化: - 的printf( 「%d%d%d」,I,++ I,I ++);輸出爲2 2 0

我沒有得到這到底是怎麼回事。有人請幫助我更好地瞭解...

+0

請改變你的程序中使用單獨的' printf'語句:'printf(「%d \ n」,i); printf(「%d \ n」,i ++); printf(「%d \ n」,++ i); printf(「%d \ n」,i);'。然後,一切都應該清晰明確,並且有意義。我已經測試過 –

+0

..順便說一句,謝謝你的回覆。 – whatsinaName

回答

0

C++不規範,其中函數參數的計算順序,這就是爲什麼結果不同的編譯器編譯器的。參見C++標準,第5.2.2/8節:

參數的評估順序未指定。

1

對同一變量有兩個副作用會給你一個未確定的結果,因爲每個編譯器都可以自由選擇它評估參數的順序。

1.9/15:如果一個標量對象上的副作用是相對於相同的標量對象上或者另一側的效果或使用相同的標量對象的值的 值計算未測序,所述 行爲未定義。

所以它可能是例如:

  • 0,0,1如果從左向右計算
  • 2,1,1如果評估從右到左
  • 2,1,2如果pre-increment是在i上完成並存儲在i中,那麼我將作爲第二個參數加載並且增加後,然後i被接受爲第三個參數(編譯器假定preincrement已經完成),然後將i作爲第一個參數。

但是其他組合也可能是合理的。和未定義行爲意味着真的不確定的,所以也許有一天這甚至崩潰(如果說一個編譯器會自動生成並行代碼和2個核心訪問相同的變量在同一時間)

+0

感謝Christophe的解釋。 – whatsinaName