黑马程序员技术交流社区

标题: 我就不明白了short s1=1;s1=s1+1;和short s1=1;s1+=1;有什么区别 [打印本页]

作者: jwx555    时间: 2014-7-13 20:19
标题: 我就不明白了short s1=1;s1=s1+1;和short s1=1;s1+=1;有什么区别
short s1=1 ;
s1 = s1 + 1 ;



short s1 = 1 ;
s1 += 1 ;

结果应该相同吧?
作者: fantacyleo    时间: 2014-7-13 20:28
当然不同。前者编译报错。后者没问题。看这里解释:http://bbs.itheima.com/thread-127149-1-1.html
作者: 双皮奶    时间: 2014-7-13 20:39
不相同的,s1 = s1 + 1中,1是int型的,s1+1后数据类型为int型,不能赋值给s1,编译都不能通过
作者: ss5619498    时间: 2014-7-13 21:02
short s=1; s=s+1; 自然是编译不通过的 提示损失精度 那么 short s=1; s+=1; 为什么能编译通过那? 还有一个问题 隐式类型转换可以从小到大自动转,即byte->short->int->long如果反过来会丢失精度,必须进行显示类型转换   而s+=1的意思与s = s+1不同,s=s+1这句先执行s+1然后把结果赋给s,由于1为int类型,所以s+1的返回值是int,编译器自动进行了隐式类型转换   所以将一个int类型赋给short就会出错,而s+=1不同由于是+=操作符,在解析时候s+=1就等价于s = (short)(s+1),翻番来讲就是   s+=1 <=> s =  (s的类型)(s+1)
作者: zhuohong_xiao    时间: 2014-7-13 21:40
+=是一个运算符号。效果和=是一样的。只要运算符右边的数字在short的范围内就可以将值赋给左边的变量。
作者: chensuyu    时间: 2014-7-13 21:48
这个不一样,Java编译器对+=运算做了优化,s1+=1;相当与s1=short(s1+1);返回值类型是short类型的,上面一个s1=s1+1;中的s1+1返回值类型是int类型的(因为1默认是int类型的,但是S1是short类型的,两者相加自动提升等级,相加结果就是int类型的。)所以但是等号前面的S1还是short类型,所以最后编译时会提示可能损失精度,第一句错误。
作者: zhuohong_xiao    时间: 2014-7-13 22:00
在这里s+=1与s=s+1是非等价的。若是等价的。编译就不会出错了。只能说s+=1的运算效果和s=s+1是一样的。我想问问s=2yu和c语题搞复杂了。
作者: zhuohong_xiao    时间: 2014-7-13 22:05
在这里s+=1与s=s+1是非等价的。若是等价的。编译就不会出错了。只能说s+=1的运算效果和s=s+1是一样的。我想问问s=2与s=(1+1)等价吗。和c语言比较就把问题复杂了。
作者: hxwo211314    时间: 2014-7-13 22:09
s1 = s1 + 1 ;编译报错,因为s1为short类型,而1为int类型,需要进制强制类型转换才可以。
而s1 += 1,它其实就等于s1 = (short) s1 + 1;它的内部自动进行了强制类型转换,将int转换为short
作者: chulangren2    时间: 2014-7-13 23:40
java中short,char,boolean型的是默认的用转化成int型来做的,隐式类型转换可以从小到大自动转,反过来会丢失精度,所以第一个会显示编译错误,丢失精度,第二个就不存在这个问题。
作者: 微笑女皇    时间: 2014-7-14 08:53
学习了!!

作者: 嘻嘻哈哈嘻嘻    时间: 2014-7-14 09:31
前面他们都讲得很详细阿 哈
作者: 佛山java爱好者    时间: 2014-7-14 09:33
+1后是int类型,编译失败
作者: 菜鸟小6    时间: 2014-10-23 17:39
ss5619498 发表于 2014-7-13 21:02
short s=1; s=s+1; 自然是编译不通过的 提示损失精度 那么 short s=1; s+=1; 为什么能编译通过那? 还有一个 ...

真厉害我也明白了
作者: zhangyangLengen    时间: 2014-11-1 08:52

short s1=1 ;
s1 = s1 + 1 ;

这一个:
s1=s1+1;
首先等号的右边:1是整型4个字节,而short类型为2个字节,底层中会将shortl字节扩充到4个字节,这样两个整数可以相加运算,但是“=”赋值运算符,等号右边是整型如果转换成short类型,可能会损失精度。由于等号
右边是变量,不好进行底层自动检测。如果非要进行强制转换,需要s1=(short)(s1+1);
而:s1=1; 就行;就是因为,等号的右边是常量,系统底层会进行自动检测,看常量有没有超过short类型的最大值。

short s1 = 1 ;
s1 += 1 ;

而下面的是:
s1 += 1 ;中的“+=”是一个运算符,底层会自动的进行强制转换。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2