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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 古银平 中级黑马   /  2012-5-16 23:08  /  8936 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 古银平 于 2012-5-17 16:31 编辑

a=a+5和a+=5运行结果一样,这两个运算底层的运行机制有什么差异吗?没搞懂。比如:定义byte a=a+5,运行会出错:损失精度错误,但a+=5不会。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
byte a=a+5因为a是byte,而5是int.编译会损失精度,不能进行运算。
a+=5底层运行机制会自动提升类型,将a提升为int ,再与5运算。
回复 使用道具 举报
byte a=a+5,5是整数,默认是int型,所以此处,把一个byte型数据a和int型数据5相加并没有错,错在于把相加之后的和赋给a,因为byte和int运算,byte就自动类型提升为int,所以和就是一个int型数据,把一个int型数据赋给byte型变量就会出现精度错误。
回复 使用道具 举报 1 0
不清楚,但是我看到这两个运算是,+=右边只有一个操作数,而a=a+5等号后边有两个操作数,而且eclipse报错的位置也是在a+5处。觉得,这是byte+int的问题,不是byte+=int的问题。
回复 使用道具 举报
查阅资料,发现,+=是复制运算符,也就是相当于=(在运算上不同),你在eclipse里用byte b = 9;肯定不会报错,那+=也就没有报错,因为是赋值运算。
回复 使用道具 举报
本帖最后由 李南江 于 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:16
7#
byte a = 5, a= a +5, java中会自动将低精度向高精度转换,当byte型的a 跟 int型的5(java中整数的默认类型为int)求和,会将byte转换成int型,求和后的值为int型,这时候将int型的值赋给byte型的a,程序就会报错。 而 a += 5, '+=' 这是一个赋值运算符,不是算数运算符,只是进行了自动提升,并没有强制转换,只是将结果赋值重新赋值给a。
回复 使用道具 举报
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;没问题;
回复 使用道具 举报
首先第一个问题:a=a+5和a+=5运行结果一样;结果肯定一样了,a的类型没有变,不过在这语句之前肯定定义过int a;,因为默认是int噢的
第二个问题:byte a=a+5 这语句,先算右边,运行结果肯定是INT类型的结果类型的(java当中类型自动会提升,是为了避免超出范围),所以你再定义给它一个byte类型的,肯定放不下,所以就错误,a+=5这是赋值运算,把左右两边相加给左边,把以没有问题....
回复 使用道具 举报
byte a a=a+5报错 因为5默认是int类型 所以会发生强制提升 byte类型提升为int类型
而用a+=5相当于一个赋值运算 不会发生强制提升
回复 使用道具 举报
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,
此时溢出判断交付到运行阶段。
回复 使用道具 举报

a=a+5和a+=5(已解决)

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

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