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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 靓仔 中级黑马   /  2013-10-28 14:21  /  1914 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 靓仔 于 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);
请问谁会通过,为什么?
}
}

评分

参与人数 1技术分 +1 收起 理由
To + 1 新人鼓励

查看全部评分

10 个回复

正序浏览
To 金牌黑马 2013-10-29 21:34:35
11#
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
我正好在看毕老师的视频,昨天刚刚看到。

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

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

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
S+=5;会通过 s=s+5;不通过  因为这涉及jvm默认的强制类型装换,s+=5  就等于 s=(short)(s+5) jvm虚拟机会默认加上强转,而s=s+5就没有

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题至“提问结束”
回复 使用道具 举报
本帖最后由 回天之力 于 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自动进行了强制类型转换吧。

评分

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

查看全部评分

回复 使用道具 举报
申锟 发表于 2013-10-28 17:29
s+=5会通过!

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

哥,版主很多,小心其他版主看到了,不给分哦亲!
回复 使用道具 举报
s+=5会通过!

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

为什么?

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


新人第一次回答问题,希望能对,召唤下 @仇邓强

评分

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

查看全部评分

回复 使用道具 举报
s=s+5,其中等号右边的s是short类型的,与整型数值 5相加后,类型自动提升为int类型,再赋值给等号左边,此时发生冲突,所以S=S+5,运行不过去。

评分

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

查看全部评分

回复 使用道具 举报
s + = 5能够通过编译,而s = s + 5则不能
理由:s的类型是short, 5的类型是int, int与short型数据相加时,short数据类型提升为int, 故结果的int,
          再通过=进行赋值时,右边的int无法直接赋值给左边的short,故无法通过编译。

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

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

评分

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

查看全部评分

回复 使用道具 举报
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

评分

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

查看全部评分

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