黑马程序员技术交流社区

标题: byte a=a+5和a+=5的问题(已解决) [打印本页]

作者: 古银平    时间: 2012-5-16 23:08
标题: byte a=a+5和a+=5的问题(已解决)
本帖最后由 古银平 于 2012-5-17 16:31 编辑

a=a+5和a+=5运行结果一样,这两个运算底层的运行机制有什么差异吗?没搞懂。比如:定义byte a=a+5,运行会出错:损失精度错误,但a+=5不会。
作者: 张红    时间: 2012-5-16 23:18
byte a=a+5因为a是byte,而5是int.编译会损失精度,不能进行运算。
a+=5底层运行机制会自动提升类型,将a提升为int ,再与5运算。
作者: 潘东升    时间: 2012-5-16 23:20
byte a=a+5,5是整数,默认是int型,所以此处,把一个byte型数据a和int型数据5相加并没有错,错在于把相加之后的和赋给a,因为byte和int运算,byte就自动类型提升为int,所以和就是一个int型数据,把一个int型数据赋给byte型变量就会出现精度错误。
作者: 高云飞    时间: 2012-5-16 23:22
不清楚,但是我看到这两个运算是,+=右边只有一个操作数,而a=a+5等号后边有两个操作数,而且eclipse报错的位置也是在a+5处。觉得,这是byte+int的问题,不是byte+=int的问题。
作者: 高云飞    时间: 2012-5-16 23:25
查阅资料,发现,+=是复制运算符,也就是相当于=(在运算上不同),你在eclipse里用byte b = 9;肯定不会报错,那+=也就没有报错,因为是赋值运算。
作者: 攻城狮    时间: 2012-5-16 23:55
本帖最后由 李南江 于 2012-5-16 23:57 编辑

a=a+5和a+=5
前者是将右边的和赋给左边(两次运算),运算过程中会将a自动提升为int 因为5是int型的值。然后再将运算后的结果(int型的值)赋给byte 所以会损失精度
□ = □+□□□□ →    □=□□□□(右边被提升)
后者是将左右两边的和赋给左边(一次运算),所以不会。
□+=□ (木有被提升)
所有byte short char 和int进行运算将会自动被提升为int
作者: 杨康    时间: 2012-5-16 23:58
byte a = 5, a= a +5, java中会自动将低精度向高精度转换,当byte型的a 跟 int型的5(java中整数的默认类型为int)求和,会将byte转换成int型,求和后的值为int型,这时候将int型的值赋给byte型的a,程序就会报错。 而 a += 5, '+=' 这是一个赋值运算符,不是算数运算符,只是进行了自动提升,并没有强制转换,只是将结果赋值重新赋值给a。
作者: 胡团乐    时间: 2012-5-17 07:18
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
        Type mismatch: cannot convert from int to byte

byte a=a+5;和a+=5;是有很大区别的
byte的范围是 -128 到 127 ;你的a=a+5;第一个a是byte型 而第二个a就是int型了啊 超出byte的范围了啊 所以会报错的
a+=5;没问题;
作者: 我能驾驭住    时间: 2012-5-17 09:07
首先第一个问题:a=a+5和a+=5运行结果一样;结果肯定一样了,a的类型没有变,不过在这语句之前肯定定义过int a;,因为默认是int噢的
第二个问题:byte a=a+5 这语句,先算右边,运行结果肯定是INT类型的结果类型的(java当中类型自动会提升,是为了避免超出范围),所以你再定义给它一个byte类型的,肯定放不下,所以就错误,a+=5这是赋值运算,把左右两边相加给左边,把以没有问题....
作者: 赵聪    时间: 2012-5-17 11:06
byte a a=a+5报错 因为5默认是int类型 所以会发生强制提升 byte类型提升为int类型
而用a+=5相当于一个赋值运算 不会发生强制提升
作者: 李文富    时间: 2012-5-17 13:01
a=a+5和a+=5运行结果一样,这两个运算底层的运行机制有什么差异吗? 这里a+=5用的是逆波兰的写法,更有利于编译器的语法分析。比如:定义byte a=a+5,运行会出错:损失精度错误,但a+=5不会。
byte a=a+5,运行会出错这是因为涉及到 5 被编译器默认为int型(32位),当你定义a为byte型(8位),此时由于+号运算符自动类型提升 即byte—>int ,这时你再把int型赋值byte型就不能装下,也就损失精度。而a+=5不会,是因为在a的变量自增5,
此时溢出判断交付到运行阶段。

作者: 古银平    时间: 2012-5-17 14:19
标题: a=a+5和a+=5(已解决)
本帖最后由 古银平 于 2012-5-17 16:30 编辑
李南江 发表于 2012-5-16 23:55
a=a+5和a+=5
前者是将右边的和赋给左边(两次运算),运算过程中会将a自动提升为int 因为5是int型的值。然 ...

谢谢,我懂了




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