当前位置: 代码迷 >> J2SE >> s1 += 1和s1 = s1 + 1的区别,该怎么处理
  详细解决方案

s1 += 1和s1 = s1 + 1的区别,该怎么处理

热度:318   发布时间:2016-04-24 13:31:08.0
s1 += 1和s1 = s1 + 1的区别
short s1 = 1; s1 = s1 + 1; 有错,s1是short型,s1+1是int型,不能显式转化为short型。
可修改为s1 =(short)(s1 + 1)

但是
  short s1 = 1; s1 += 1;为什么是正确的呀?


------解决方案--------------------
http://topic.csdn.net/u/20070712/19/199bb5b0-49eb-474d-9387-0c9c0d49fbd8.html
看2楼的回复
------解决方案--------------------
在这里java和c++是不一样的
第一种情况中,short型和int型是不能够这样直接相加的,
而第二种情况下+=会自动转换的
应该是java的特性吧,没有太多的为什么吧

如有不对,请指教
------解决方案--------------------
s1 = s1 + 1;计算时候是先计算s1+1,把两个类型的数据计算的结果临时存入一个变量中(两个数据类型都不一样,自然不能计算了),然后把这个变量在赋值给s1;
而 s1 += 1是直接隐式转换把s1和1相加(所以没有问题),并没有创建新的变量直接把计算结果赋给s1,这就是s1+=1比s1=s1+1用的时间少;

我是这么理解的不知道对不对,请参考,给点建议!
------解决方案--------------------
s1+1得到的结果是int类型的,自然不能赋给short,加一个强制转换就行,如果是s1+=1的话,s1+1的结果隐式转换成s1的类型,在赋给s1,不用显式转换,这就是“操作符=” 的功能。
------解决方案--------------------
+=为复合赋值表达式.复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量
的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。
然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行
一个窄化原始类型转换。
为了说得具体一些,并提供一个解决方案给这个谜题,假设我们在该谜题的两个
赋值表达式之前有下面这些声明:
short x = 0;
int i = 123456;
复合赋值编译将不会产生任何错误:
x += i; // 包含了一个隐藏的转型!
你可能期望x 的值在这条语句执行之后是123,456,但是并非如此l,它的值是
-7,616。int 类型的数值123456 对于short 来说太大了。自动产生的转型悄悄
地把int 数值的高两位给截掉了。这也许就不是你想要的了。
相对应的简单赋值是非法的,因为它试图将int 数值赋值给short 变量,它需要
一个显式的转型:
x = x + i; // 不能编译——“可能会丢掉精度”
这应该是明显的,复合赋值表达式可能是很危险的。为了避免这种令人不快的突
袭,请不要将复合赋值操作符作用于byte、short 或char 类型的变量上。在将
复合赋值操作符作用于int类型的变量上时,要确保表达式右侧不是long、float
或double 类型。在将复合赋值操作符作用于float 类型的变量上时,要确保表
达式右侧不是double 类型。这些规则足以防止编译器产生危险的窄化转型。
总之,复合赋值操作符会悄悄地产生一个转型。如果计算结果的类型宽于变量的
类型,那么所产生的转型就是一个危险的窄化转型。这样的转型可能会悄悄地丢
弃掉精度或数量值。对语言设计者来说,也许让复合赋值操作符产生一个不可见
的转型本身就是一个错误;对于在复合赋值中的变量类型比计算结果窄的情况,
也许应该让其非法才对。
  相关解决方案