複合賦值運算子(Compound Assignment Operators)問題:a=a+b 真的等同於a+=b嗎?
阿新 • • 發佈:2018-11-15
首先看一個問題:
int a=1;
a=a+2L;
System.out.println(a);
這段程式碼是不能通過編譯的,因為a+2L計算結果是long型別的,即3L,賦值給a,會損失精度,所以編譯失敗;如果最終賦值給long類新的變數,是可以的,如下:
int a=1;
long b=2L;
b=a+b;
System.out.println(b);
那麼再看下這段程式碼:
int a=1;
a+=2L;
System.out.println(a);
這段程式碼是正常編譯執行的,結果輸出:3
疑問產生了,不是說a=a+b 等同於a+=b嗎?
探索:
顯然,上面的a+=b不是按照a=a+b計算的,否則編譯都通不過。
猜想:
+=計算的時候,對資料型別做了強制轉換;
證明:
搜尋半天,有人說是做了強轉,但是沒有有力的證據證明,
企圖通過編譯後的class檔案找到不一樣的地方,未果,轉而Java的官方文件,果然找到了相關說明:
https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.2
文件表達的意思已經很明確了,
a+=b 相當於 a=(a的型別)(a+b),即對a+b的結果,用a的型別做強制轉換後再賦值給a;
所以 a=a+b 和 a+=b 並不是完全一致的,差了一個對結果的強制轉換過程。