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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马薛有义 黑马帝   /  2011-7-19 11:30  /  2330 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了张老师面试大全,里面有这样一个面试题short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
老师的讲解理解了,现在的问题是java中对+=、*=等等这些运算符是一种什么样的机制?

5 个回复

倒序浏览

回复 楼主 的帖子

因为S1是short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过,即需要进行强制转换。      而后面的那个不会发生类型的提升,只是在其基础上加了一个1,还是short型,所以不会出错。
[ 本帖最后由 毕仁杰 于 2011-07-19  11:52 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-7-19 12:07:19
藤椅
我认为出现+=,*=这些运算符一是为了简化格式书写,二就是避免计算机对数据进行不必要的类型提升。希望对你有用。
回复 使用道具 举报
黑马网友  发表于 2011-7-19 12:12:59
板凳

回复 楼主 的帖子

关键不是+=、*=,而是数字1默认就是int类型的,所以int与short运算,肯定超大范围转换。类似的,小数如3.5默认的double类型的,要看成float类型的要加f或F(3.5f、3.5F)。它也有类似的问题。
回复 使用道具 举报
黑马网友  发表于 2011-7-19 12:24:46
报纸

回复 楼主 的帖子

应该是这样的,
short s1 = 1; s1 += 1;

short s1 = 1; s1 = s1 +1;
是一样的
出错是因为
s1 = s1 + 1 中,等式右边s1+1会隐性称为一个int型
而等式左边又是short型,int型的数是不能直接给shot型的变量赋值的
要进行强制类型转换
回复 使用道具 举报
首先short s1 = 1将s1声明为short型,1默认为int,所以s1 = s1 + 1相当于把int赋值给了short,所以不行,可以强制类型转换成short;而 s1 += 1属于复合赋值运算,系统会自动将类型转换成=左边的类型,所以不报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马