文章出處
文章列表
前言:
我們在編碼的時候, 經常會使用到 a 加上一個數或者加上一個字符串, 然后再賦值回給 a . 那么 a=a+b 和 a+=b是相同的么?
情景1:
a, b 類型相同, 且都為值類型
@Test public void demo1() { int a = 10; int b = 11; a = a + b; System.out.println("a = a + b : " + a); a = 10; a += b; System.out.println("a += b : " + a); }
情景2:
a,b 類型相同, 且都為引用類型:
@Test public void demo2() { String a = "a"; String b = "b"; a = a + b; System.out.println("a = a + b : " + a); a = "a"; a += b; System.out.println("a += b : " + a); }
情景3:
a, b類型不同, 一個為值類型, 一個為字符串類型
@Test public void demo3() { String a = "a"; int b = 10; a = a + b; System.out.println("a = a + b : " + a); a = "a"; a += b; System.out.println("a += b : " + a); }
從上面看, 好像能得出結論, 沒啥區別啊, 是把?
如果真是這樣, 那么我試試 a,b都是值類型, 但是有效范圍不同, 或者說長度不同. 看看是不是也是這樣呢.
情景4:
a, b都是值類型,但是a長度小, b長度長
@Test public void demo4() { int a = 10; long b = 10L; a = a + b; System.out.println("a = a + b : " + a); a = 10; a += b; System.out.println("a += b : " + a); }
在編寫的時候, 從編譯器上, 已經能看到不同了.
盡管如此, 我還是運行一下看看.
報精度丟失錯誤, 因為 等號 要求兩邊的類型一致, 很明顯, int + long , int 自動轉為高精度數據long, 相當于 int = long + long , 這時候, 發現等號兩邊數據類型不一致啊, 怎么賦值啊.
這里其實就相當于寫了 : int c = 10L;
看一下編譯器怎么提示:
我們都知道 int -> long , 沒有問題, 因為不會產生值失真. 但是如果把 long -> int , 是有可能產生 失真 的. 那電腦不能決定是否要給你截值, 除非我們手動告訴電腦, 我們就要這么玩.
int c = (int)10L;
我將a=a+b注釋掉, 看看 a+=b行不行
運行成功了. 為啥 += 能成功呢?
從結果上看, += 肯定為我們做了類型轉換, 否則也不會成功的. 最后給到精度小的值, 當然有溢出風險是肯定的.
文章列表
全站熱搜