int a=2 ;int b=a+3*a++
int a=2 ;int b=(a++)+3*a
第一個b=8第二個b=11
結果為什麼不一樣啊
哎,怎麼還這帖子呀,這實際單純是編譯器誰寫的就是什麼規則。
從java來說,一個表達式來了,邊掃描邊取數,符合規則就計算,不是說一看到表達式就去計算運算符的優先級高的部分,它也得從左往後解析過去。
int b=a+3*a++
就比如上面這句話,表達式是a+3*a++,從左往後掃描,掃描到a,取a的值2,後面是+號,+號運算需要2個數,還需要往下掃描一個數,掃描到是3,但發現3後面是*,優先級高於+號,乘號也是需要2個數,接著取下一個數a(值是2),再往下掃描是++,優先級高於*號。
根據掃描順序,你可以得到一個獨立的指令列表(棧)2,3,2,++,*,+這麼一組指令。執行++後,原來的a的值是3(這改的不是棧中的,是a變量的值),所以表達式計算中還是2*3+2
如果上面表達式改成
int b=3*a++ + a的話,那結果就不一樣了
從左往右掃描,取常數3,往下掃描是乘號,需要再取一個數,是a,取a的值2,接著掃描下一個,發現是++,優先級高於乘號。接著往下掃描,發現是+號,優先級低於前面。則前面可以先運算了。
前面的指令列表是 3,2,++,*。執行++,原來的a的值是3(這改的不是棧中的,是a變量的值),執行乘,3*2=6,這是後再看是+號,取下一個數,是a,取值,這時候值是3了,已經改變了。所以變成6+3=9.
大概過程是這麼一個過程。
各種語言同一行的編譯和執行方式都有些差異的,這得看具體的語言,比如C語言就不會出現9。
如果自己還不清楚,建議去看看JVM相關的指令編譯和執行過程相關的內容。
另外,把前面的帖子結了吧。