这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨。
嗯,好了。先看一段源代码
short value=2;
value-=2;
源码就是上面这个样子的,我动手写的时候因为理解的问题,把代码改成了这个样子
short value=2;
value=value-2;
这时候编译器就和我杠上了,报第二行有错。想想也对, value 变量和一个整型运算后 Java 会自动将运算结果提升到 int 类型,这和 value 定义的时候的 short 类型的产生矛盾。
提供的修改意见有两个:
value的类型改为 int ;
value-2的运算结果强制转换为 short 类型;
第一段代码没有报错,那说明类型转换没有问题,就是说复合赋值运算里面有个偷偷摸摸类型转换的过程,但究竟是怎样转换的,采用的修改意见1)还是2)?
翻翻了手头的书,个人理解如下:
value-=2 和 value=value-2 划等号;
value-2 等价于 value=(value 的类型) (value-2) ;
所以说在复合赋值运算当中,会自动将他计算的结果值强制类型转换为左侧的类型。
当然结果和左侧类型相同的时候就不会有任何的影响。
顺藤摸瓜,如果左边的类型要比计算结果的那个类型范围要小?肯定会丧失精确,造成Bug 比如:
short value=2;
//系统自动隐身的类型转换
value+=80000//从高位截断,发生了溢出,结果不是你想要的
System.out.println(valueA);
总结一下:
优点:复合赋值运算方便,简单。而且很有效率,在性能上面也有优势;
缺点:在你最不设防的精度问题上面背后给你一枪。
所以在你运算符左边是个小范围而右边的运算结果是个大范围的时候,一定要小心。