例子[1]:
第一種情況:
short a = 1; a = a + 1; // 這一步會報錯 System.out.print(a);
編譯器會報錯,原因如下:
第二種情況:
short a = 1; a += 1; System.out.print(a);
這種情況不會報錯。
java語言規范中關於復合賦值的解釋是這樣的:E1 op= E2
等價於E1=(T)(E1 op E2)
,這里的T是E1的數據類型,即復合賦值是自帶了隱式的強制類型轉換的。
第三種情況:
short a = 1; short b = 1; short c = a + b;
這種情況依然會編譯出錯,因為Java中存在的類型升級,導致兩個short
類型的運算也會轉換成int
進行。
類型升級
在Java中,對基本數據類型做比較或者運算時,如果兩邊的數據類型不同,在可以比較的前提下會首先進行類型升級:
- 如果任一方為
double
,則另一方轉換為double
- 否則如果任一方為
float
,則另一方轉換為float
- 否則如果任一方為
long
,則另一方轉換為long
- 否則兩邊都會轉換為
int
- 否則兩邊都會轉換為
- 否則如果任一方為
- 否則如果任一方為
即從高到低分別為double
, float
, long
, int
即使是兩個short
類型運算,也會轉換成int
進行,這就是前面第三種情況出現錯誤的原因。
-
參考https://blog.csdn.net/allenjay11/article/details/78613862 ↩︎