这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨。

嗯,好了。先看一段源代码

   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);

总结一下:

优点:复合赋值运算方便,简单。而且很有效率,在性能上面也有优势;

缺点:在你最不设防的精度问题上面背后给你一枪。

所以在你运算符左边是个小范围而右边的运算结果是个大范围的时候,一定要小心。

最新文章

  1. mybatis generator使用(基于maven)
  2. javascript的对象 和 JSON 对象?
  3. SQL Server 查询、搜索命令、语句
  4. 模拟赛1101d1
  5. linux下安装php的imagick扩展模块(附php升级脚本)
  6. df du
  7. Android 的实现TextView中文字链接的4种方法
  8. 【转】十二个移动App云测试服务盘点
  9. 快速扫描文本文件,统计行数,并返回每一行的索引位置(Delphi、C#)
  10. Windows服务、批处理项目实战
  11. CSS3秘笈复习:第八章
  12. R语言入门(二)基础语法
  13. CentOS 7.2下安装Mono 5.0
  14. Android基础知识大全(精品)
  15. python win32 简单操作
  16. LeetCode之“数组”:Rotate Array
  17. 【学习笔记】tensorflow图片读取
  18. POJ 3974 Palindrome (算竞进阶习题)
  19. 继承LinearLayout自定义左侧菜单
  20. 【ASP.NET】UCenter实现多站点同步登录退出

热门文章

  1. day12-迭代器
  2. MongoDB之Replica Sets环境搭建
  3. leetcode-9-basic-binary search
  4. python模块之sys
  5. LeetCode(172)Factorial Trailing Zeroes
  6. HDU - 6199 gems gems gems (DP)
  7. Centos启动时停止在登录界面但不显示登录信息(一直在转圈)
  8. bzoj3039 joyoi1939 玉蟾宫 悬线法
  9. PHP 开启或关闭错误提示
  10. PHP模版引擎twig wordpress中调用文章第一张图片