剛學java,現遇到這個問題,若有定義int a=2,則執行完語句a+=a-=a*a;後a的值是多少。按以往c語言的語法應該為-4 而現在為什麼java運行後值是0呢?
java和c的運算規則不一樣,例如下面這段代碼在Java總運行時
1. long a = 2,b = 9;
2. a += b -= a*a;//a = 7,b=5,與C一致
3. a = 2;
4. a += a-= a*a;//
在Java中賦值順序為從左到右,a*a與b的結果送給b,b在和a做運算結果送給a,這個順序與c語言是一樣的,
假若將b換成a即第四行代碼重新運算,編譯器對其進行了規則優化認為運算中的變量是一個,都采用原先的值對其運算,中間的運算結果暫存在堆棧中,因此a*a與a做減法運算的結果臨時存在了堆棧中,此時a中的結果還是2,最後一步是a+=堆棧中的值運算(-2),所以等於0
在C中第四行的運算規則與第二行一致,他把中間的臨時結果更新到變量中了因此最後的結果為-4.,