黑马程序员技术交流社区
标题:
面试题: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