A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

short s1=1 ;
s1 = s1 + 1 ;



short s1 = 1 ;
s1 += 1 ;

结果应该相同吧?

14 个回复

正序浏览

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 ;中的“+=”是一个运算符,底层会自动的进行强制转换。

回复 使用道具 举报
ss5619498 发表于 2014-7-13 21:02
short s=1; s=s+1; 自然是编译不通过的 提示损失精度 那么 short s=1; s+=1; 为什么能编译通过那? 还有一个 ...

真厉害我也明白了
回复 使用道具 举报
+1后是int类型,编译失败
回复 使用道具 举报
前面他们都讲得很详细阿 哈
回复 使用道具 举报
学习了!!
回复 使用道具 举报
java中short,char,boolean型的是默认的用转化成int型来做的,隐式类型转换可以从小到大自动转,反过来会丢失精度,所以第一个会显示编译错误,丢失精度,第二个就不存在这个问题。
回复 使用道具 举报
s1 = s1 + 1 ;编译报错,因为s1为short类型,而1为int类型,需要进制强制类型转换才可以。
而s1 += 1,它其实就等于s1 = (short) s1 + 1;它的内部自动进行了强制类型转换,将int转换为short
回复 使用道具 举报
zhuohong_xiao 来自手机 中级黑马 2014-7-13 22:05:07
8#
在这里s+=1与s=s+1是非等价的。若是等价的。编译就不会出错了。只能说s+=1的运算效果和s=s+1是一样的。我想问问s=2与s=(1+1)等价吗。和c语言比较就把问题复杂了。
回复 使用道具 举报
zhuohong_xiao 来自手机 中级黑马 2014-7-13 22:00:50
7#
在这里s+=1与s=s+1是非等价的。若是等价的。编译就不会出错了。只能说s+=1的运算效果和s=s+1是一样的。我想问问s=2yu和c语题搞复杂了。
回复 使用道具 举报
这个不一样,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 21:40:00
报纸
+=是一个运算符号。效果和=是一样的。只要运算符右边的数字在short的范围内就可以将值赋给左边的变量。
回复 使用道具 举报
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)
回复 使用道具 举报
不相同的,s1 = s1 + 1中,1是int型的,s1+1后数据类型为int型,不能赋值给s1,编译都不能通过
回复 使用道具 举报
当然不同。前者编译报错。后者没问题。看这里解释:http://bbs.itheima.com/thread-127149-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马