解答:
首先,
是因为你对“+=”这个赋值运算符没有真正搞明白,
平时看到的书上讲得过于简单,没有给出s+=2;与s=s+2;有什么区别,所以使用起来你会郁闷。
其实很简单,记着就好了,不必深层次的理解。
其次,
可能你还没真正理解:
强制类型转换、隐含强制类型转换、自动类型转换 三者的概念。
解释如下:
short s = 3;
s = s + 2;
编译失败原因:
如果一个整数没有赋给一个声明了数据类型的变量,这个整数在参加运算的默认类型就是int类型。
“2”这个整数的默认数据类型是int类型,当进行s+2运算时,s发生了数据自动提升,也就是自动类型转换。
即:s自动转换为与2相同的数据类型int类型,然后进行了加法运算,
两个int类型的数据相加后肯定还是一个int类型,最后赋给数据类型为short的s时,就发生了数据丢失。
相关知识:
Java在需要和允许的情况下,总是将变量向着更高精度类型的方向转换,这样不会引起数据丢失,这个过程叫做类型提升(类型自动提升)。
在没有进行强制装换的情况下,高位数的数据不能转换为低位数的数据,否则造成数据丢失。金字塔赋值顺序是不可逆转的!
s+=2;
编译通过的原因:
因为“+=”运算符在给s赋值时,自动完成了强制类型转换操作,
综上所述,不能简单的认为,s+=2;与s = s + 2;不是等价的。
当short s = 3;
s+=2;与s = (short)(s + 2); 结果是一样的。
s+=2;与s = s + 2; 执行过程不是一样的,前者通过,后者不能通过。
拓展:
long l = 3;
l = l + 2;
System.out.println("l="+l);
可以通过编译,此时:l = l + 2;与l+=2;执行结果是一样的。
|
-
add.jpg
(55.22 KB, 下载次数: 20)
基本类型变量间的赋值关系
|