黑马程序员技术交流社区

标题: JAVA的细节.求指点 [打印本页]

作者: 吴琼    时间: 2012-6-19 23:57
标题: JAVA的细节.求指点
本帖最后由 吴琼 于 2012-6-24 09:57 编辑

        byte b = 5;
           b=b+2;编译的时候这句报错
        b+=2; 为什么这种表现形式可以呢?b+=2等同于 b=b+2.的呀
作者: 黑马—陈磊    时间: 2012-6-20 00:00
本帖最后由 黑马—陈磊 于 2012-6-20 00:03 编辑

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

根据自动类型提升,我们知道,b (byte型)+ 2(int型),结果为(int),将int赋值给byte,会损失精度,当然会报错。
b+=2;(可以正确编译)
由于+=运算符有自加功能,定义byte b =5;时,开辟了一个空间,当通过+=运算符运算时,只是在原来的栈中进行运算;不需强行转化
作者: 胡大强    时间: 2012-6-20 01:44
涉及到类型提升问题。。。。
所谓类型提升,当两个数据之间类型不同时,若直接进行比较或赋值运算时会自动先将两个不同类型的数据均转化为其中的某种类型再进行操作,就发生了类型提升。
所有的byte型和short型的值被提升到int型.其次,如果一个操作数是long型,整个表达式将被提升到long型;如果一个操作数是float型,整个表达式将被提升到float型;如果有一个操作数是double型,计算结果就是double型.
所以,b=b+5;两边类型会不一样,,,当然会报错了。。。



作者: 李伟    时间: 2012-6-20 02:09
b+=2;+=这里有个隐式强制强换, 如果右边的计算结果没有超过左边的类型范围,这里的计算结果就是声明时的类型(byte)。如果右边的运算结果超过了左边的类型范围同样会有损精度

作者: 车风波    时间: 2012-6-20 08:49
第一句 + 左右两边自动提升为int所以int不能自动转到右边的byte
第二句b+=2这是一次运算,内部自动转换。
作者: 刘笑    时间: 2012-6-20 09:47
楼上正解,我就不废话了
作者: 朱东方    时间: 2012-6-20 13:02
本帖最后由 朱东方 于 2012-6-20 13:04 编辑

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




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