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

时间:2022-10-21 04:21:57

前言:

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

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

情景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);
}

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

情景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);
}

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

从上面看, 好像能得出结论, 没啥区别啊, 是把?

如果真是这样, 那么我试试 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);
}

在编写的时候, 从编译器上, 已经能看到不同了.

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

尽管如此, 我还是运行一下看看.

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

报精度丢失错误, 因为 等号 要求两边的类型一致, 很明显, int + long , int 自动转为高精度数据long, 相当于 int = long + long , 这时候, 发现等号两边数据类型不一致啊, 怎么赋值啊.

这里其实就相当于写了 : int c = 10L;

看一下编译器怎么提示:

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

我们都知道 int -> long , 没有问题, 因为不会产生值失真. 但是如果把 long -> int , 是有可能产生 失真 的. 那电脑不能决定是否要给你截值, 除非我们手动告诉电脑, 我们就要这么玩.

int c = (int)10L;

我将a=a+b注释掉, 看看 a+=b行不行

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

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

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