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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴琼 中级黑马   /  2012-6-19 23:57  /  1930 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴琼 于 2012-6-24 09:57 编辑

        byte b = 5;
           b=b+2;编译的时候这句报错
        b+=2; 为什么这种表现形式可以呢?b+=2等同于 b=b+2.的呀

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 黑马—陈磊 于 2012-6-20 00:03 编辑

b=b+2;编译的时候这句报错:
等式的右边在运算时 发生了自动类型提升 等式右边被提升为int 数据类型 而等式左边依然是byte数据类型 所以编译报错
所以要转换一下格式就好了,如b = (byte)(b +2);
b+=2;等式 只进行了一次赋值运算,它存在自动转换的动作。即将b+c的值同时赋给b
回复 使用道具 举报
b=b+2; 由于b=b+2;运算时会自动提升表达式的类型,所以结果是int型,再赋值给byte类型b时,编译器将报告需要强制转换类型的错误。
b+=2由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
回复 使用道具 举报

根据自动类型提升,我们知道,b (byte型)+ 2(int型),结果为(int),将int赋值给byte,会损失精度,当然会报错。
b+=2;(可以正确编译)
由于+=运算符有自加功能,定义byte b =5;时,开辟了一个空间,当通过+=运算符运算时,只是在原来的栈中进行运算;不需强行转化

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
涉及到类型提升问题。。。。
所谓类型提升,当两个数据之间类型不同时,若直接进行比较或赋值运算时会自动先将两个不同类型的数据均转化为其中的某种类型再进行操作,就发生了类型提升。
所有的byte型和short型的值被提升到int型.其次,如果一个操作数是long型,整个表达式将被提升到long型;如果一个操作数是float型,整个表达式将被提升到float型;如果有一个操作数是double型,计算结果就是double型.
所以,b=b+5;两边类型会不一样,,,当然会报错了。。。


回复 使用道具 举报
b+=2;+=这里有个隐式强制强换, 如果右边的计算结果没有超过左边的类型范围,这里的计算结果就是声明时的类型(byte)。如果右边的运算结果超过了左边的类型范围同样会有损精度
回复 使用道具 举报
第一句 + 左右两边自动提升为int所以int不能自动转到右边的byte
第二句b+=2这是一次运算,内部自动转换。
回复 使用道具 举报
刘笑 中级黑马 2012-6-20 09:47:59
8#
楼上正解,我就不废话了
回复 使用道具 举报
本帖最后由 朱东方 于 2012-6-20 13:04 编辑

b=b+2;是算数运算加赋值运算,就像上面说的 int变byte损失了精度。
b+=2;这个只是赋值运算,存在自动强制转换操作。
你看一看java基础视频,      “java第二天09.算数运算符”       毕老师在里面讲的很详细。

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

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