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

简介:

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

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

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

 

总结一下:

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

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

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


本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/archive/2013/06/03/3115994.html,如需转载请自行联系原作者

相关文章
|
4月前
|
Java
栈的简单应用(利用Stack进行四则混合运算)(JAVA)
中缀表达式转后缀表达式图解, 代码实现过程, 完整代码, 利用后缀表达式求值, 完整代码
46 0
|
4月前
|
存储 Java
最新Java基础系列课程--Day10-IO流文件处理(一)
最新Java基础系列课程--Day10-IO流文件处理
|
5月前
|
存储 缓存 Java
最新Java基础系列课程--Day10-IO流文件处理
最新Java基础系列课程--Day10-IO流文件处理
|
14天前
|
存储 Java 数据安全/隐私保护
【Java探索之旅】运算符解密 位运算,移位运算
【Java探索之旅】运算符解密 位运算,移位运算
22 0
|
1月前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
25 4
|
2月前
|
Java 程序员
Java代码竟能如此轻松表示数学函数运算
Java代码竟能如此轻松表示数学函数运算
14 0
|
3月前
|
存储 Java 测试技术
滚雪球学Java(09-5):Java中的赋值运算符,你真的掌握了吗?
【2月更文挑战第7天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
115 2
|
3月前
|
存储 Java 对象存储
[Java]基本数据类型与引用类型赋值的底层分析的小结
[Java]基本数据类型与引用类型赋值的底层分析的小结
69 0
|
3月前
|
存储 Java 编译器
Java字符串变量声明与赋值的常见面试题——完整剖析
Java字符串变量声明与赋值的常见面试题——完整剖析
23 1
|
3月前
|
Java
Java 数学运算与条件语句全解析
Java 的 Math 类 拥有许多方法,允许您在数字上执行数学任务。 常用方法: Math.max(x, y): 找到 x 和 y 的最大值 Math.min(x, y): 找到 x 和 y 的最小值 Math.sqrt(x): 返回 x 的平方根 Math.abs(x): 返回 x 的绝对值 Math.random(): 返回一个介于 0.0 和 1.0 之间的随机数
51 1