2014-01-19 128 views
-6

爲什麼此代碼將輸出顯示爲「3 2」而不是「2 3」? `printf(「%d%d n」,i ++,i ++)輸出

#include<iostream> 
#include<stdio.h> 
#include<string.h> 
#include<string> 
#include<map> 
#include<vector> 
using namespace std; 
int main(){ 
    int i=2; 
    printf("%d %d\n",i++,i++); 
return 0; 
} 

`

輸出是: 「3 2」

+3

C++爲什麼printf和它是不確定的行爲 –

+1

看看這個http://stackoverflow.com/questions/4176328/undefined-behavior - 序列點 – suspectus

+1

我可以問什麼促使你問這個問題?如果這不是關於它的奇怪行爲的討論,那是什麼? –

回答

0

printf評價的順序是從右在這裏留下

首先評估

printf("%d %d\n",i++,i++); 
     ^

Then

printf("%d %d\n",i++,i++); 
     ^

所以你得到的輸出作爲3 2

行爲將肯定未定義由於參數未定義的評估順序。

在上一個序列點和下一個序列點之間,對象的存儲值最多隻能通過評估表達式修改一次。此外,先驗值只能讀取以確定要存儲的值。

4

在此語句,表達 的「printf(...)」修改變量「i」不止一次 而沒有中間序列點。

此行爲 未定義。

編譯器有檢測其中 相同的變量已被修改不止一次在 表達而不 修改之間的序列點的情況。因爲會發生什麼樣的修改 last沒有定義,所以這個表達式可能在不同的平臺上產生不同的結果 。

重寫表達式,以便每個 變量只被修改一次。

即使你可能會得到輸出「2 3」在不同的編譯器

相關問題