Java復合賦值運算符(Compound Assignment Operators)
原文鏈接:https://clclcl.fun/2019/11/02/java/Compound-Assignment-Operators/
簡單介紹Java復合賦值運算符(+= -= *= /+ >= >>>= |= &=
)中的運算類型轉換。
首先看一段代碼:
int i = 10; long j = 100; i = i + j; //Compiling error: incompatible types: possible lossy conversion from long to int i += j; //Correct. System.out.println(i);
很多人(包括我自己)都簡單的復合賦值符把 i += j
理解為 i = i + j
,那么為什么會出現上面的運算問題呢?這就得從java規范里,對+=
這類復合賦值運算符的復合賦值符定義了。
什么是復合賦值運算符(Compound Assignment Operators)?
簡單來講,就是復合賦值符運算加賦值,譬如:+= -= *= /+ >= >>>= |= &=
,運算統一稱為op=
.在Java規范里,復合賦值符這種運算符的效果是什么呢?
假設兩個變量,A,運算B,復合賦值符類型分別為TA,運算TB(當然可能是復合賦值符相同的類型),那么A op= B
等效于A = (TA)(A op B)
.
這樣回頭去看上面的運算代碼,就很清楚問題的復合賦值符原因了:i + j
由于類型的自動提升,結果為long
類型,自然 i = i + j
把long
類型的值賦給int
類型的變量會出錯。而i += j
等效于i = (int)(i + j)
,對long
類型的值做了強制轉換(cast to int).
Also see JAVA語言規范中關于復合賦值運算符 jls-15.2.26.2
作者:。淑女范erり
來源鏈接:https://www.cnblogs.com/ofyou/p/Compoun-Assignment-Operators.html