程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> java運算符 優先級-JAVA運算符優先級問題還有什麼是入棧

java運算符 優先級-JAVA運算符優先級問題還有什麼是入棧

編輯:編程綜合問答
JAVA運算符優先級問題還有什麼是入棧

int a=2 ; int b=a+3*a++ ;
b的值為什麼是8,a++不是先賦值後自+1嗎
b不是等於3+3*2嗎最後結果不是9嗎
還有就是什麼是入棧雙目運算為什麼先入棧啊

最佳回答:


你的問題是昨天danielinbiti回答你的吧。
首先,他說的本身沒有問題,但是我覺得danielinbiti把問題說復雜了。
解釋下什麼是“入棧”,Java編譯器會把你的程序編譯成中間代碼(Java字節碼),這種中間代碼不面向具體的機器,而是一種抽象的計算機,這種計算機使用了一種類似堆棧的結構來處理它的指令。
這涉及到編譯原理等背景知識,這裡不展開說。
但是你應該從語言本身去理解。而不是編譯器的實現。按照Java編譯器對代碼的理解意圖,它會視a為一個不變的值,這樣做的好處是,a只會被求值一次。因此,
a+3*a++中左邊的a不會因為a++而增加1。
要注意一個問題,a++中的a和a++表達式求值是兩回事。a++雖然擁有表達式中最高的優先級,但是說的是a++被求值擁有最高的優先級,而不是說a++被求值後對a的改變會反映到表達式上。
我之前分析了,這個表達式是一個副作用表達式,它的表意本身就是含糊的,所以不要試圖預測編譯器的行為。
順便說下,這其實和Java是否使用計算棧還是什麼別的方式編譯和生成代碼其實沒有關系,計算棧也是圖靈等價的,沒有道理說它會有別於別的計算機或者抽象計算機設備。
這只是Java編譯器設計者的一種意圖的體現——當代碼擁有規范所沒有規定的行為的時候,或者說,它可以這麼被理解,也可以那麼被理解,這種情況下,編譯器可以選擇一種讓它實現簡單的方式去實現。
而代碼最終是這樣而不是那樣,只是這種設計的體現。

u010712045
caozhy
u010712045
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved