short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
阿新 • • 發佈:2018-11-11
short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1;有錯嗎?
答:對於short s1 = 1; s1 = s1 + 1;由於1是int型別,因此s1+1運算結果也是int 型,需要強制轉換型別才能賦值給short型。而short s1 = 1; s1 += 1;可以正確編譯,因為s1+= 1;相當於s1 = (short)(s1 + 1);其中有隱含的強制型別轉換。
這裡涉及到變數型別統一的問題
有這樣的規則,1.高位轉低位需要強制轉換
2.低位轉高位自動轉.
short s1 = 1; s1 = s1 + 1;有什麼錯?
答: i 是int 型 s1 short型 通過 + 運算後
s1 自動轉為int 型 所以錯!
short s1 = 1; s1 += 1;有什麼錯?
答: 如果你認為表示式(x += i)只是表示式(x = x + i)的簡寫方式,這並不準確。這兩個表示式都被稱為賦值表示式。第二個表示式使用的是簡單賦值操作符(=),而第一個表示式使用的是複合賦值操作符。Java語言規範中講到,複合賦值(E1 op=E2)等價於簡單賦值(E1=(T)((E1) op (E2))),其中T是E1的型別,除非E1只被計算一次。
換句話說,複合賦值表示式自動地將所執行計算的結果轉型為其左側變數的型別。如果結果的型別與該變數的型別相同,那麼這個轉型不會造成任何影響。然而,如果結果的型別比該變數的型別要寬,那麼複合賦值操作符將悄悄地執行一個窄化原生
因此,複合賦值表示式可能是危險的。為了避免這種令人不快的突襲,請不要將複合賦值操作符作用於byte、short或char型別的變數。
因為S1是short型的,佔2個位元組,而1是int型的,佔4個位元組。在兩個型別的值相加的時候,會發生自動型別的提升。也就是說s1+1後,其結果是int型的,而不是short型的,所以可以想想看,把4個位元組的東西放在兩個位元組的空間裡,肯定編譯不通過。
後面的那個不會發生型別的提升,JAVA規範上說 e1+=e2 實際上是 e1=(T1)(e1+e2),其中T1是e1的資料型別。 s1+=1等效於 s1=(short)(s1+1),所以是正確的。