警惕它----“复合赋值运算”
添加时间:2013-6-3 点击量:
这是今天在开辟傍边碰到的题目,固然不是很大,但还是花了一点时候去揣摩。
嗯,好了。先看一段源代码:
short value=2;
value-=2;
源码就是上方这个样子的,我下手写的时辰因为懂得的题目,把代码改成了这个样子:
short value=2;
value=value-2;
这时辰编译器就和我杠上了,报第二行有错。想想也对, value 变量和一个整型运算后 Java 会主动将运算成果提拔到 int 类型,这和 value 定义的时辰的 short 类型的产生抵触。
供给的批改定见有两个:
1)把 value的类型改为 int ;
2)把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);
总结一下:
长处:复合赋值运算便利,简单。并且很有效力,在机能上方也有上风;
毛病:在你最不设防的精度题目上方背后给你一。
所以在你运算符左边是个小局限而右边的运算成果是个大局限的时辰,必然要警惕。
我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
这是今天在开辟傍边碰到的题目,固然不是很大,但还是花了一点时候去揣摩。
嗯,好了。先看一段源代码:
short value=2;
value-=2;
源码就是上方这个样子的,我下手写的时辰因为懂得的题目,把代码改成了这个样子:
short value=2;
value=value-2;
这时辰编译器就和我杠上了,报第二行有错。想想也对, value 变量和一个整型运算后 Java 会主动将运算成果提拔到 int 类型,这和 value 定义的时辰的 short 类型的产生抵触。
供给的批改定见有两个:
1)把 value的类型改为 int ;
2)把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);
总结一下:
长处:复合赋值运算便利,简单。并且很有效力,在机能上方也有上风;
毛病:在你最不设防的精度题目上方背后给你一。
所以在你运算符左边是个小局限而右边的运算成果是个大局限的时辰,必然要警惕。