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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 红茶2331 中级黑马   /  2013-11-12 19:28  /  2198 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天老师留的一道题,不知道什么原理啊?

short s1 = 1; s1 = s1 + 1;编译为什么会出错啊?
short s1 = 1; s1 += 1;怎么就可以通过编译呢

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 这个问题每天都有人提问,善用论坛资源并总.

查看全部评分

6 个回复

倒序浏览
因为short  s1 = 1  1本来默认为int类型的  但1赋值给了 short类型的s1  而后面的 s1 = s1 + 1   
1还是默认的int类型的  而int与short2个类型是不能直接参与运算 所以报错了 会损失精度

而第二个  +=号是  赋值运算符   自身默认会强制转换数据类型的   s1 = (short)(s1 + 1)

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
计算机运算中有两个规则 1.如s1=1和s1+=1这样的的等号右侧是常数表达式,这时候,可以int32到int16的隐式转换;2.另一个规则是:等号右侧的计算表达式默认推定为int32,哪怕是两个int16相加,它不能够隐式转换为int16。
s1 = s1 + 1;等号右侧是计算表达式,计算的结果根据规则2我们可以知道是int类型的,那么赋值给左边的short类型的s1就会报错。
s1 += 1 等号右侧是常数,这时候计算机可以把右侧的int类型隐式的转换为short类型,再赋给左侧的shor类型的s1,所以没有问题

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
简单说就是short s1 = 1; 之后s1是short型数据。
而数字1师默认为int型的数据。
所以s1+1是short和int型一起运算。得出的结果自动成为int型数据。
所以不能把这个结果自动付给s1了。需要用强制转换格式s1=(short)(s+1);
回复 使用道具 举报
Θ动@咚Θ 发表于 2013-11-12 20:03
计算机运算中有两个规则 1.如s1=1和s1+=1这样的的等号右侧是常数表达式,这时候,可以int32到int16的隐式转换 ...

啊,是会损失精度的,就是这两个规则以前没怎么看过,看过也是模里两可的。
回复 使用道具 举报
short s1 = 1; s1 = s1 + 1;short是2Byte,1是int类型4Byte,s1+1时会把s1提升为int在赋值给s1就不行了,因为s1是2B装不下,就好比4两饭用2两装,
s1+=1,因为+=是一个赋值符号,里面有强转动作,好比s1=(short) (s1+1)
回复 使用道具 举报
short s1 = 1; s1 = s1 + 1;编译为什么会出错啊?
short s1 = 1; s1 += 1;怎么就可以通过编译呢
第一个为什么会出错呢   楼上的已经解释过了   我想说下第二个
s1+=1 这个为什么会编译通过呢  是因为+=这个复合赋值符,他包含一个隐藏的转型!  ,他不是简单的s1=s1+1的简写。复合赋值表达式会自动的将它们所执行的计算结果转换为其左侧变量的类型。
呵呵 希望对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马