Java中x=x+1 与x+=1 的一点区别
来源:互联网 发布:淘宝网儿童打底衫 编辑:程序博客网 时间:2024/05/21 15:50
转载自:http://www.cnblogs.com/heshan664754022/archive/2013/04/01/2994028.html
作者:十年半山
首先来看下面两行代码:
- short s1 = 1;
- s1 = s1 + 1;
对于稍微有点Java经验的人来说,这个是非常简单的问题,他们肯定会说 这样是无法通过编译的。
首先,因为short类型是16位的,而int类型是32位的,在进行(s1+1) 运算时,自动将s1提升到32位,然后与i相加,
得到的结果是32位的,而此时s1=s1+1; 必然报错,因为这样会丢失2个字节的精度,这是不容许的。但是你可以执行强转:
s1=(short)(s1+1); 这样就没问题了.
现在我们再看下面这两行代码:
- short s1 = 1;
- s1 +=1;
许多程序员都会认为这里的表达式(s1 +=1)只是上面表达式(s1 = s1 + 1)的简写方式,至少以前我是这样认为的。但是这并不十分准确。
这两个表达式都被称为赋值表达式。开头那条语句使用的是简单赋值操作符(=),而这里这条语句使用的是复合赋值操作(+=)。
Java语言规范中讲到,复合赋值 E1 op= E2等价于简单赋值E1 = (T)((E1)op(E2) 其中T是E1的数据类型,op为操作符.
这种类型转换或者是一个恒等转换,或者是一个窄化转换.
换句话说,复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原始类型转换。
但是我们让JVM自动的为我们进行窄化转换这样好吗?我们来看下,下面这个问题
- short s1=Short.MAX_VALUE;//32767
- s1+=1;
- System.out.println(s1);
你可能会认为结果是32768,但是你一运行就会发现它会打印出:-32768,此时你也许幡然醒悟,原来我们丢失了精度,所以我们在用复合
赋值操作(+=)的时候要特别注意,这时它会窄化原始类型转换(即会丢失精度)。
0 0
- Java中x=x+1 与x+=1 的一点区别
- Java中x=x+1 与x+=1 的一点区别
- x=x+1,x+=1,x++的区别
- Java中x=x+y与x+=y的区别,体现强制类型转换
- x+=1与x=x+1区别
- MATLAB中cov(x)与cov(x,1)的区别
- x+=y与x=x+y的区别
- x+=y与x=x+y的区别
- x=x&(x-1)
- x=x&(x-1)
- x = x&(x-1)
- x = x&(x-1)
- Java中x+=y和x=x+y两种实现的区别
- x &= (x-1)
- x&(x-1)=?
- x=x+1、x+=1、x++、++x
- c++ x=x|(x+1); x&(x-1)
- Java x=x+(x++)+(++x)分析
- 借助JQ简单的实现文字滚动效果
- IntelliJ IDEA常用快捷键——基于Eclipse
- linux压缩解压文件
- void sharpen(const cv::Mat &image, cv::Mat &result)
- Xcode如何打包ipa安装包
- Java中x=x+1 与x+=1 的一点区别
- [codevs1116] 四色问题
- Java常用类库——Runtime类
- 获取var card_type = $("#card_id").find("option:selected").data('card_type');
- Java 8十个lambda表达式案例
- java以及JavaScript获取当月第一天和最后一天日期
- aapt日常日常使用记录
- python3.5 URLError: <urlopen error [Errno 10061]报错解决方法
- Android图片加黑遮罩,