回答
我很高興你問,因爲在其他問題很少有人試圖解釋爲什麼它是這樣(plodoc的回答可能是最近的)。最重要的部分是:
§15.7.2術前評估操作數:
「Java編程語言也 保證的 操作的每一個操作數(除有條件 運營商& &,||和?:)似乎 在 的任何部分執行操作本身之前被充分評估。「
這裏的=
是簡單賦值運算符=(§15.26.1)
這也保證了左操作將首先評估(§15.7.1),但左側是在這種情況下微不足道的。
這意味着x++
必須在評估賦值運算符之前進行評估。增量將在賦值之前發生,並且由於它是後增量,所以它的計算結果爲x
的舊值。
最後,當評估賦值運算符時,「old x」將被存儲在x中。
重要的是要強調,無論在編譯器中它做了什麼,或者看起來(或沒有)它有多直觀,在所有語言中都無法保證這一點。
這也是不是優先的問題。在C和C++中,++
的優先級高於=
。但在這些語言中,在序列點之間修改兩次變量是未定義的行爲。因此完全兼容的C編譯器會產生不同的結果。
*「在操作之前評估操作數」*使我認爲它會在增量之前從'++ x'中得到x的值,發生了什麼事情......你能澄清這一點嗎? – 2010-10-01 19:19:18
@Tom,它是'x ++'。它確實獲得了原始價值。如果你做'x = 0; x = x ++;','x ++'(賦值運算符的右操作數)在賦值之前完全計算,所以x被立即設置爲1.但是計算結果爲0(原始值),那就是然後分配給'x'。 – 2010-10-01 19:44:17
如果在操作之前指定了Evaluate操作數,那麼它應該用於++ x和x ++;或者每個人都有一個規範? – 2010-10-01 20:19:15
- 1. 這是JVM錯誤還是「預期行爲」?
- 2. MySQL的變化來自其他行
- 3. 來自其他UIViewController的NSString爲空
- 4. css stylelint規則來捕捉'選擇器是預期的'錯誤
- 5. 來自XML數據的NSStatusBar標題行爲不規律
- 6. 來自其他類和其他主要問題的控制表
- 7. 它是一個錯誤?商定規範的意外行爲
- 8. 這是strconv.ParseFloat()行爲預期還是錯誤?我怎樣才能解決它?
- 9. 來自其他類的Webpack訪問類
- 10. MySQL的來自其他表
- 11. 來自其他表的PHP
- 12. C#位移:這是規範中的行爲,是bug還是偶然?
- 13. 錯誤:InvalidAuthenticationTokenTenant'訪問令牌來自錯誤的發行者
- 14. 來自addr2line的錯誤行號
- 15. 是ReferenceEquals - true和Equals - 錯誤的預期行爲?
- 16. 這是Ruby中的錯誤還是Ruby中的正確行爲?
- 17. 來自HttpWebResponse的流的奇怪行爲
- 18. 來自dict.fromkeys的不想要的行爲
- 19. 更新來自Acumatica中其他網格行的網格行
- 20. angularjs - html5mode不是預期的行爲
- 21. 預期的行爲是什麼?
- 22. 這是UriBuilder的預期行爲嗎?
- 23. cudaEventElapsedTime不是預期的行爲
- 24. 瞭解IActivity是來自機器人還是來自IActivityLogger中的用戶
- 25. 來自appengine aetest的行爲不一致
- 26. 來自unsigned_int64的意外行爲;
- 27. 來自PHP頭的奇怪行爲()
- 28. python:來自struct pack的意外行爲()
- 29. 來自[TestMethod]的Directory.CreateDirectory行爲奇怪
- 30. 來自setInterval()的奇怪行爲
從鏈接很明顯是不是?這不是一個錯誤或一個功能,不管它是什麼,它都是*記錄*。是的,預計。 – nawfal 2014-07-20 09:07:43