Java 基础【10】复合赋值运算

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

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

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

 

总结一下:

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

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

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

 

posted @   Orson  阅读(1462)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示