Java規(guī)范有這樣的規(guī)則:
- 高位轉(zhuǎn)低位需要強制轉(zhuǎn)換
- 低位轉(zhuǎn)高位自動轉(zhuǎn).
short s1 = 1;
s1 = s1 + 1; 有什么錯敲街?
short s2 = 1;
s2 += 1;
short s1 = 1; s1 = s1 + 1;
有什么錯?
s1是short型茫因,1是short型膝宁,通過+運算符,計算的時候s1轉(zhuǎn)換為int型买羞,最后把s1+1賦值給s1的時候峻贮,s1是short型,所以出錯澎粟。
short s1 = 1; s1 += 1;
有什么錯?
如果你認為表達式x+=i
只是表達式x=x+i
的簡寫方式蛀序,這并不準確。
這兩個表達式都被稱為賦值表達式捌议。x=x+i
表達式使用的是簡單賦值操作符=
哼拔,而x+=i
表達式使用的是復合賦值操作符。Java語言規(guī)范中講到瓣颅,復合賦值E1 op =E2
等價于簡單賦值(E1=(T)((E1) op (E2)))
倦逐,其中T是E1的類型,除非E1只被計算一次。換句話說檬姥,復合賦值表達式自動地將所執(zhí)行計算的結(jié)果轉(zhuǎn)型為其左側(cè)變量的類型曾我。如果結(jié)果的類型與該變量的類型相同,那么這個轉(zhuǎn)型不會造成任何影響健民。然而抒巢,如果結(jié)果的類型比該變量的類型要寬,那么復合賦值操作符將悄悄地執(zhí)行一個窄化原生類型轉(zhuǎn)換秉犹。
因此蛉谜,復合賦值表達式可能是危險的。為了避免這種令人不快的突襲崇堵,請不要將復合賦值操作符作用于byte型诚、short或char類型的變量。 因為s1是short型的鸳劳,占2個字節(jié)狰贯,而1是int型的,占4個字節(jié)。在兩個類型的值相加的時候赏廓,會發(fā)生自動類型的提升涵紊,也就是說s1+1后,其結(jié)果是int型的幔摸,而不是short型的摸柄,所以可以想想看,把4個字節(jié)的東西放在兩個字節(jié)的空間里既忆,肯定編譯不通過塘幅。
后面的那個不會發(fā)生類型的提升,JAVA規(guī)范上說e1+=e2
實際上是e1=(T1)(e1+e2)
尿贫,其中T1是e1的數(shù)據(jù)類型。 s1+=1等效于s1=(short)(s1+1)
,所以是正確的踏揣。