小心它----“复合赋值运算”

 这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨。http://bbs.itheima.com/thread-23776-1-1.html?fstgj以前的学习网站,-全套java视频教程,需要的自己看下,可以去这个网站下载,下载视频免费,不需要注册和做什么任务

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

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);
复制代码

 

总结一下:

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

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

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

 

转载于:https://my.oschina.net/u/1170022/blog/138468

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值