1. 程式人生 > >複合賦值運算子(Compound Assignment Operators)問題:a=a+b 真的等同於a+=b嗎?

複合賦值運算子(Compound Assignment Operators)問題:a=a+b 真的等同於a+=b嗎?

首先看一個問題:

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  並不是完全一致的,差了一個對結果的強制轉換過程。