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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liguangcaiup 中级黑马   /  2013-7-19 16:29  /  1374 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 liguangcaiup 于 2013-7-20 21:17 编辑

byte b = 100; b = b + 1; 报错         
byte b = 100; b += 1;  、// 为什么不报错                       
byte b = 1; b = ++b;    为什么对




评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 哥们你这个应该知道吧

查看全部评分

7 个回复

倒序浏览
第一个报错是因为 b+1经过运算被提升为了int型了,int型赋值给byte型的b就出错了。
第二个+=是有一个自动的强制转换过程,将int转回了byte就相当于 b = (byte)(b+1)
第三个不太清楚。想来也是和第二个同样的道理,有一个自动强制转换过程

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
毕姥爷视频里的例子
short s = 3;

s=s+2;

s+=2;
有什么区别?

s=s+2编译失败。这是两次运算,s被提升为int型,运算结果为int型,无法赋给short类型;

s+=2编译通过,这是一次运算,+=运算符在给s赋值时,自动完成了强制转换操作。
s=++s同理

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 闲人忙啊 于 2013-7-19 17:37 编辑

b+=1是b=b+1的简化,但在JVM运行语句b+=1时,会自动加强制类型转换,强转为byte型,即b=(byte)(b+1);
而JVM运行语句b=b+1时没有该动作,b+1的结果会自动转为int型,并赋值给byte型的b,所以系统会报错

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
闲人忙啊 发表于 2013-7-19 16:53
b+=1是b=b+1的简化,但在JVM运行语句b+=1时,会自动加强制类型转换,强转为byte型,即b=(byte)(b+1);
而JVM运行 ...

++b 呢?
回复 使用道具 举报
b. byte b = 1; b = b + 1;
   错误,因为b为byte类型的变量,其值可能会在byte类型的范围内变化,虚拟机不能进行判断再加上1后是否会溢出。

  
c. byte b = 1; b = b += 1;   
   正确,因为虚拟机会先运行b+=1的结果得到b的值,然后再将得到的b的值再次赋值给b,
   注:b+=1能正常运算,因为会将b+1的结果自动强转为byte类型后赋值给b。
           但是假如运行byte b=127;b = b += 1;则得到的运行结果不是我们希望的128,而是-128.

  
d. byte b = 1; b = ++b;  
   正确,原因同c。先计算++b的值强转为byte类型后得到b的值,
   然后再将得到的b的值再次赋值给b。但是假如运行byte b=127;b = b += 1;则得到的运行结果不是我们希望的128,而是-128.

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报

++b其实和b+=1一样,即b=(byte)(b+1)
回复 使用道具 举报
b+1经过运算被提升为了int型了,int型赋值给byte型的b就出错了。
+=必须有计算结果输出的,所以jvm有一个自动的强制转换过程,将int转回了byte就相当于 b = (byte)(b+1)
++b其实和b+=1一样,也是必须有计算结果输出的,而且计算结果经jvm判断在byte范围内,所以也正确
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马