文章出處

前言:

  我們在編碼的時候, 經常會使用到 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行不行

運行成功了. 為啥 += 能成功呢?

從結果上看, += 肯定為我們做了類型轉換, 否則也不會成功的. 最后給到精度小的值, 當然有溢出風險是肯定的. 

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()