黑马程序员技术交流社区

标题: 面试题:s+=5与s=s+5的区别? [打印本页]

作者: 靓仔    时间: 2013-10-28 14:21
标题: 面试题:s+=5与s=s+5的区别?
本帖最后由 靓仔 于 2013-10-29 21:58 编辑

class OperateDemo1
{
public static void main(String[] args)
{
short s=5;
s+=5;
s=s+5;
System.out.println(s);
请问谁会通过,为什么?
}
}
作者: ixiangfeng    时间: 2013-10-28 14:46
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

作者: 雨过丶天已晴    时间: 2013-10-28 15:16
s + = 5能够通过编译,而s = s + 5则不能
理由:s的类型是short, 5的类型是int, int与short型数据相加时,short数据类型提升为int, 故结果的int,
          再通过=进行赋值时,右边的int无法直接赋值给左边的short,故无法通过编译。

         至于s += 5 为什么能够通过呢?其实,这里有一个隐式转换的问题
        所有双目运算符与=一起结合成符号赋值运算符,如+=、-=等都隐含了一句话
       s + = 5 ;等价于 s = (short) (s + 5);
       所以能够通过,其实对于这个能通过的说法有很多,我只是说一种

希望对楼主有所帮助,错误之处,大家多多指正

作者: 奋斗@zbt    时间: 2013-10-28 16:35
s=s+5,其中等号右边的s是short类型的,与整型数值 5相加后,类型自动提升为int类型,再赋值给等号左边,此时发生冲突,所以S=S+5,运行不过去。
作者: 申锟    时间: 2013-10-28 17:29
s+=5会通过!

首先s+=5是一次运算,不涉及数据类型的提升,而s=s+5是两次运算。

为什么?

因为开始定义s为short类型,在内存中占用2个字节。
而与5做加法运算时,因为5是int类型,在系统中占用4个字节,所以数据会进行强制提升。
在提升后,int数据类型无法赋值给short,所以编译不通过。


新人第一次回答问题,希望能对,召唤下 @仇邓强
作者: linjl_ll    时间: 2013-10-28 18:58
申锟 发表于 2013-10-28 17:29
s+=5会通过!

首先s+=5是一次运算,不涉及数据类型的提升,而s=s+5是两次运算。

哥,版主很多,小心其他版主看到了,不给分哦亲!
作者: 回天之力    时间: 2013-10-28 21:44
本帖最后由 回天之力 于 2013-10-28 21:51 编辑

s=s+5:在java程序中,会有自动向上转型,即(s+5)就完成了向上转型,成为int。而这时s还是short型,要向把int赋值给short必须得强制类型转换。s=short(s+5);
s+=5:在java jvm中,+=符号就是一步,不像上面的分成两步,所以我感觉jvm自动进行了强制类型转换吧。

作者: 黄炳期    时间: 2013-10-28 22:00
如果问题已经解决,请及时修改主题至“提问结束”
作者: 喂,咱不离!    时间: 2013-10-28 22:12
S+=5;会通过 s=s+5;不通过  因为这涉及jvm默认的强制类型装换,s+=5  就等于 s=(short)(s+5) jvm虚拟机会默认加上强转,而s=s+5就没有
作者: 咸鱼要吃猫    时间: 2013-10-28 22:19
我正好在看毕老师的视频,昨天刚刚看到。

由于不同数据类型放在一起运算时,系统会有个临时统一运算类型的过程,自动向上统一。
s=s+5  程序能够运算出结果,但是在输出时数据类型,int数据类型无法赋值给short。

而 +=、-=等 则是java可以识别的运算符把,  就好像你算的是1+1+1,而我算得是1X3

作者: To    时间: 2013-10-29 21:34
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2