2014-04-14 137 views
-4
int x=10; 
printf("%d %d %d\n",x,++x,x++); 
printf("%d %d %d",x,x+20,x+30); 

它打印成打印順序

12 12 10 
12 32 42 

輸出爲什麼第一個printf的順序是相反的順序,爲什麼不能在第二printf語句? 我在一本書中發現C使用反向打印順序。

+1

或... [未定義的行爲和順序點](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)以及其他許多人。 – WhozCraig

+0

在評估過程中,首先將所有值從右側開始放入堆棧。如果變量具有任何後/前增量,則會評估並存儲該值。否則,它將作爲變量存儲在堆棧中並獲取var的最終值。最右邊的x ++ - 10,因爲它的後綴inc將x更新爲11.對於++ i - 12,pre inc並將x更新爲12,因爲它在堆棧中。最終輸出將是12 12 10,這是從堆棧中檢索的順序。 – Dinesh

回答

2

您的代碼有未定義的行爲(「UB」)。因此,任何事情都會發生。

具體而言,違反的規則是除了確定要寫入的值之外,不得讀取和寫入沒有順序點的相同變量。

+0

由於評論長度有限,我已將該陳述改爲printf(「%d%d%d%d」,i,++ i,i ++,i);其中i = 1在評估過程中,首先將所有值從右邊開始放入堆棧。如果變量具有任何後/前增量,則會評估並存儲該值。否則,它將作爲變量存儲在堆棧中並獲取var的最終值。對於i ++ - 1,因爲它的後綴inc更新我爲2. for ++ i - 3,pre inc和更新我爲3,因爲它在堆棧中。對於var作爲我在堆棧中取我的最終值爲3.最終的輸出將是3 3 1 3 – Dinesh

+0

@Dinesh:這不符合標準... – Deduplicator

+0

printf遵循我上面指定的規則。沒有改變和不變的varibales這樣的sperate規則。 – Dinesh