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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. byte b=1;b=b+1;//错误
  2. byte b=1;b=++b;//正确
复制代码
请给出原因,没看明白的不要下回答,谢谢!!

19 个回复

倒序浏览
本帖最后由 javaAndroid 于 2014-10-11 21:02 编辑

第一个写法存在一个类型提升的问题。
你定义的b是byte类型,长度为1个字节,
然后你用b加上1,而1是int类型,占4个字节
所以运算过程中结果就变为了int类型
再把b+1赋给b的话就相当于把int类型的4个字节用byte类型的1个字节来存放
所以会报错。
下面那个存在隐式转换的,所以没错。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 任献东 于 2014-10-11 16:00 编辑

第一个   byte b = 1; b = b + 1; 之所以是错误的是因为编译通不过去  
            因为b = b + 1相当于[byte] b = [byte] b + [int] 1    。[byte] b要自动提升为int类型再与 [int] 1进行运算,运算结果要进行强制转换的,否则编译会错误
第二个   byte b = 1; b = ++b;编译可以通过  这个运算的过程是,先进行++b的运算,再把运算后的结果赋给b,++b计算后是一个int类型的, 不管结果等于多少,底层会进行一个强转  ,也就是说++b就相当于 b = (byte)(b+1),所以这个编译也没有问题,但是对变量b的赋值会不生效!
我明白的楼主的意思, 这个疑惑我也想过,说通俗点 第二个之所以编译能通过,是因为++b这是java底层进行的转化,所以编译没问题。b+1和++b虽然运行过程是一样的,都是b+1, 但区别就是第二个是JAVA底层在做(很重要所以说两遍),所以没问题。
回复 使用道具 举报
第一行:b在执行+1的时候,涉及到类型转换,byte转成int,和1相加后结果为int型,要把int型赋值给byte型,当然会错。   
回复 使用道具 举报
楼上说的很对
回复 使用道具 举报
。。。。。。。。。。。。
回复 使用道具 举报
凡是byte 、char 、short数据类型数据在运算 的时候都会自动转换成int类型数据再运算的。
byte b =1; b = b+1; //  两个不同类型的数据在运算 的时候,结果取决于大的数据类型数据, 结果就是int类型
byte b = 1;b =++b; //相当于  b =(byte) ( b+1)  自动类型转换
回复 使用道具 举报
任献东 发表于 2014-10-11 15:56
第一个   byte b = 1; b = b + 1; 之所以是错误的是因为编译通不过去  
            因为b = b + 1相当于 b ...

如果照你说的++底层会做强转,那么请分析下面的代码为什么会错?
  1. int i=1;
  2. byte b=++i;
复制代码

回复 使用道具 举报
javaAndroid 发表于 2014-10-11 15:29
第一个写法存在一个类型提升的问题。
你定义的b是byte类型,长度为1个字节,
然后你用b加上1,而1是int类型 ...

如果照你说的++底层会做强转,那么请分析下面的代码为什么会错?


01.int i=1;

02.byte b=++i;
复制代码
回复 使用道具 举报
本帖最后由 javaAndroid 于 2014-10-12 18:40 编辑

i为int类型,++i依然为int,长度4个字节
byte为1个字节,把4字节的东西放到1个字节里编译不通过
毕老师基础视频刚开始就有讲
除非你手动进行强转。
而如果是byte b=1;b=++b;
这里应该是存在一个隐式转换
先提升b为int类型,自增后再转回byte类型。
上面的分析只是个人的理解,目前我还没有学习到这个深度。
可能有所疏漏。
回复 使用道具 举报
本帖最后由 Fightin黑马 于 2014-10-12 19:33 编辑

第一个 byte b=1;b=b+1;//错误 原因是在Java中数字默认是int类型,b是byte类型,在运算时byte类型的b会自动提升为int类型,运算结果是int类型,把int类型的结果赋值给byte类型会出现损失精度
第二个byte b=1;b=++b;//正确 原因这里分为两个部分第一部 ++b  即b=(byte)(b+1);b的类型是和他本身的类型相同的,第二部把b赋值给b,两个都是byte类型可以赋值成功,第二部没有强转的操作,这个要和b+=1;区分开

关于int i=1;  byte b=++i; 这里的两部分 第一部分i=(int)(i+1)  i的类型是不变的,第二部中把int类型的i赋值给byte类型的b就会发生损失精度.
b+=i;就没有问题
回复 使用道具 举报
Fightin黑马 发表于 2014-10-12 19:32
第一个 byte b=1;b=b+1;//错误 原因是在Java中数字默认是int类型,b是byte类型,在运算时byte类型的b会自动提 ...

合理  ++底层未做强转
回复 使用道具 举报
二楼正解。我记得毕老师的视频有讲到这个问题
回复 使用道具 举报
第一句类型转换异常了吧,b+1被转换成int了,改成b = (byte)(b+1);
回复 使用道具 举报
run_wind 来自手机 中级黑马 2014-10-15 16:04:20
15#
b=(byte)(b+1);
回复 使用道具 举报
类型转换问题,b要先转换成int型,加上1之后再转换为byte型,高类型转地类型要强制转换。您技术分都那么高了还会被这问题难住?
回复 使用道具 举报
。看看。。。。。
回复 使用道具 举报
第一个有由高向低的转换,不能隐式转化,要强制声明b = (byte) (b + 1);
第二个不存在转换问题。 ++ 运算符的那个“1”是和被操作变量同类型的 。
回复 使用道具 举报
javaAndroid 发表于 2014-10-11 15:29
第一个写法存在一个类型提升的问题。
你定义的b是byte类型,长度为1个字节,
然后你用b加上1,而1是int类型 ...

第二个没有进行转换操作。++的那个"1",是和被操作变量同类型的。

评分

参与人数 1黑马币 +4 收起 理由
javaAndroid + 4

查看全部评分

回复 使用道具 举报
ifinver 发表于 2014-10-19 17:02
第二个没有进行转换操作。++的那个"1",是和被操作变量同类型的。

嗯,明白了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马