tips: a=a+b 与 a+=b

前言:

  我们在编码的时候, 经常会使用到 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行不行

运行成功了. 为啥 += 能成功呢?

从结果上看, += 肯定为我们做了类型转换, 否则也不会成功的. 最后给到精度小的值, 当然有溢出风险是肯定的. 

 

posted @ 2017-12-30 11:46  Sniper_ZL  阅读(408)  评论(0编辑  收藏  举报