2010-09-30 43 views

回答

6

我很高興你問,因爲在其他問題很少有人試圖解釋爲什麼是這樣(plodoc的回答可能是最近的)。最重要的部分是:

§15.7.2術前評估操作數:

「Java編程語言也 保證的 操作的每一個操作數(除有條件 運營商& &,||和?:)似乎 在 的任何部分執行操作本身之前被充分評估。「

這裏的=是簡單賦值運算符=(§15.26.1

這也保證了左操作將首先評估(§15.7.1),但左側是在這種情況下微不足道的。

這意味着x++必須在評估賦值運算符之前進行評估。增量將在賦值之前發生,並且由於它是後增量,所以它的計算結果爲x的舊值。

最後,當評估賦值運算符時,「old x」將被存儲在x中。

重要的是要強調,無論在編譯器中它做了什麼,或者看起來(或沒有)它有多直觀,在所有語言中都無法保證這一點。

這也是不是優先的問題。在C和C++中,++的優先級高於=。但在這些語言中,在序列點之間修改兩次變量是未定義的行爲。因此完全兼容的C編譯器會產生不同的結果。

+0

*「在操作之前評估操作數」*使我認爲它會在增量之前從'++ x'中得到x的值,發生了什麼事情......你能澄清這一點嗎? – 2010-10-01 19:19:18

+0

@Tom,它是'x ++'。它確實獲得了原始價值。如果你做'x = 0; x = x ++;','x ++'(賦值運算符的右操作數)在賦值之前完全計算,所以x被立即設置爲1.但是計算結果爲0(原始值),那就是然後分配給'x'。 – 2010-10-01 19:44:17

+0

如果在操作之前指定了Evaluate操作數,那麼它應該用於++ x和x ++;或者每個人都有一個規範? – 2010-10-01 20:19:15

相關問題