a = a + b 与 a += b

00x00

在强类型语言中 (C, C++, Java), 常量都有自己对应的数据类型 例如 C/C++ 、Java中 整数 12 的数据类型是 int, 浮点数 1.0 在 Java 中的数据类型是 double,在 C/C++ 中是 float

00x01

在 C/C++ 中,以下代码编辑器器(clion)会显示警告,但编译过程不会显示任何警告信息。

1
2
int a = 1;
short b = a;

DeepinScreenshot_select-area_20180521225000.png

同样代码在 Java 中则直接显示错误信息,而且无法通过编译。

DeepinScreenshot_select-area_20180521225307.png

00x02

同样地,在 C/C++ 中,下面这一段明显会溢出的代码,也能够顺利通过编译。

1
2
3
int a = 1000;
char b = 0;
b = b + a;

DeepinScreenshot_select-area_20180522091451.png

在 Java 中,不能通过编译。

DeepinScreenshot_select-area_20180522091451.png

00x03

前面提到过,整数默认类型是 int 。那么我们可以预料到,以下代码在 Java 中会报错

1
2
char a = 0;
a = a + 1;

DeepinScreenshot_select-area_20180522091451.png

同样,我们也可以预料到,在 C/C++ 中,只是编辑器显示一个警告而已。

DeepinScreenshot_select-area_20180522091451.png

00x04

我们换一种写法。

1
2
byte a = 0;
a += 1000

DeepinScreenshot_select-area_20180522091451.png

结果

DeepinScreenshot_select-area_20180522091451.png

结果明显是错的,但是编辑器和编译器都没有任何提示!

看看 C++

DeepinScreenshot_select-area_20180522091451.png

DeepinScreenshot_select-area_20180522091451.png

结果和 Java 是一样的。。

00x05

可以推断出的结论是 在 C/C++ 和 Java 的编译器中

1
a += b;

并不是等价于

1
a = a + b;

而是等价于

1
a = ([type_of_a]) (a + b)

------ end ------