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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 庄纪光 黑马帝   /  2011-9-28 21:58  /  2115 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么执行short s1 = 1; s1 = s1 + 1;时编译器报错,而short s1 = 1; s1 += 1;正确编译?

4 个回复

倒序浏览
黑马网友  发表于 2011-9-28 22:40:09
沙发
short s1 = 1,s1是short型的,而s1+1返回的是int型的,你把int型的赋给short型的当然报错啦,而s1 += 1只有一步赋值操作,是在原来short型的基础上加1,不存在类型不匹配的问题。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回的的不错!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-28 23:22:51
藤椅
因为
s1 = s1 + 1;  
s1+1 这个表达式是类型是int 类型,与左边的short不一致,编译失败

而  s1+=1  其实它等价于(short)(s1+1)   它有一个隐式的强制类型转换,所以编译能通过

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-29 02:52:04
板凳

强传问题

为什么执行short s1 = 1; s1 = s1 + 1;时编译器报错,而short s1 = 1; s1 += 1;正确编译?
short s1 = 1; s1 += 1;这个问题就是java虚拟机在编译时会自动相加的
short s1 = 1; s1 = s1 + 1;s1是short型的 而1是代表int型的他们相加得到的结果是int型的(也就是说s1 + 1)是int型的
你结果等于s1就会损失精度!

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-29 08:21:59
报纸
s1=s1+1会错因为s1是short,而1是int,所以运算时会自动转换为int,再将int赋值给s1是需要强制转换,所以会错。
JAVA规范上说e1+=e2 实际上是 e1=(T1)(e1+e2),其中T1是e1的数据类型s1+=1等效于   s1=(short)(s1+1),所以是正确的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马