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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1262734817

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 1262734817 初级黑马   /  2014-5-19 14:32  /  976 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

S=S+2与S+=2到底有什么不同?

6 个回复

倒序浏览

回帖奖励 +1

效果是一样的,但是S=S+2有可能会发生类型转换,比如当S是byte型时,S+2在执行时会将S转换为int型数据,然后再进行S+2的运算,返回结果将是int型,这时候再赋值给byte型的变量S会报错;而S+=2不会出现这样的问题,因为+=运算符不会发生类型转换
回复 使用道具 举报 1 0
本帖最后由 饥渴ing 于 2014-5-19 18:22 编辑

假设S为int类型。 s=s+2;编译时是将局部变量s压入到栈然后把2压入到栈在执行iadd,最后将结果弹出栈存到局部变量s
其他基本类型s=s+2和s+=2一样.(boolean除外)
S为String对象时.两个表达式都是创建一个StringBuilder然后append();.
回复 使用道具 举报
short s;  声明变量,s为short类型的变量
s = s + 2;  2为整数,在java中默认存储为int类型的值,所以 s+2生成的结构为int类型的值,然后要将int类型的值赋给声明short类型值的s,不能自动类型转换,这里需强制转换才行。
s+=2;当进行+=运算符给s赋值时,将自动完成强制转换操作。
回复 使用道具 举报
同意二楼说的
回复 使用道具 举报
如果声明的s是short类型,例如:
short s =2
s =s+2编译的时候会报错,因为s+2的时候会提升为int类型,然后再赋给short类型的s时会报错:损失精度。
s+=2则可以通过编译,因为它内部会有一个自动转换过程。
这应该是它们的主要区别
回复 使用道具 举报
s+=2  相当于s=(s的类型)(s+2),
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马