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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏日蓝雪 中级黑马   /  2014-6-5 11:19  /  1482 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 夏日蓝雪 于 2014-6-6 10:35 编辑

Byte b=10;
b=b+1;//编译不通过
b+=1;//编译通过
”b=b+1“与”b+=1“不是一个意思吗?为什么一个可以通过,一个就不能通过编译呢?它们在编译时有什么区别吗?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

12 个回复

倒序浏览
本帖最后由 榨菜 于 2014-6-5 11:56 编辑

1 默认是int的类型 。因为保存到byte中,所以需要强制类型。
回复 使用道具 举报
Byte b=10;
b=b+1;
这里b=b+1相当于执行了两次运算,一是b+1,由于1是int型,在运算过程中b的类型会自动提升到int型,它们运算的结果11也是int型,二是b=11,而b已经被定义为byte型,int型的11自然不能赋值给byte型的b。
b+=1;
这里b+=1只执一赋值运算,没有b+1这个过程。至于底层如何赋值就不清楚了。

回复 使用道具 举报 1 0
楼上说的我觉得是对的,但是byte取值范围不是-128~127,按道理说1也可以算是byte类型啊,为什么1必须要算到int类型里呢?
回复 使用道具 举报
上杉 发表于 2014-6-5 12:10
楼上说的我觉得是对的,但是byte取值范围不是-128~127,按道理说1也可以算是byte类型啊,为什么1必须要算到 ...

整数都默认为int类型
小数都默认为double类型
回复 使用道具 举报
b+=1 类型可以自动提升 记住就行了
回复 使用道具 举报
其实这个问题你看下.class反编译后的源代码就知道了,建议你下载一个java反编译的软件,有些问题你可以通过这个方法来发现问题。
Byte b=10;
b=b+1;  //编译不通过 是因为1是int类型的,不能从int转到Byte,如果要转,必须强转。
b+=1;  //编译通过      是因为当数据类型不一定时,默认进行了强转。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
Crystal静新 发表于 2014-6-5 13:53
其实这个问题你看下.class反编译后的源代码就知道了,建议你下载一个java反编译的软件,有些问题你可以通过 ...

谢谢!这个方法不错!
回复 使用道具 举报
西门吹风 发表于 2014-6-5 12:05
Byte b=10;
b=b+1;
这里b=b+1相当于执行了两次运算,一是b+1,由于1是int型,在运算过程中b的类型会自动提 ...

“b+=1只执一赋值运算”这应该是问题的关键。谢谢,学习了!
回复 使用道具 举报

Byte b=10;
b=b+1;//编译不通过
b+=1;//编译通过

b=b+1;这个报错是因为他进行两个判断,第一次,b和1相加 也就是一个byte类型数据和一个int型数据相加,结果被强转为int型,第二次,然后再把这个int类型数据放到一个byte类型的数据中,判断之后发现会放不下,所以出错了,byte占8位  ,int占34位,应该知道吧。
b+=1; 这个没有报错,是因为他只进行一次判断,只判断b+1是不是在byte类型范围内,是的话就把他强转为byte型,所以不会出错,关键是他有一个自动转换动作。
回复 使用道具 举报
首先 b是byte类型的,即占一个字节,b=b+1;1默认是int 类型的,即占四个字节,所以b=b+1;其中右边b+1运算的话,类型的提升了,即  byte=int,赋值是会有精度损失的,所以编译不通过,除你强制类型转换!即 b=(byte)(b+1);而b+=1,也就相当于b=(byte)(b+1);
回复 使用道具 举报
李小然 发表于 2014-6-5 12:21
整数都默认为int类型
小数都默认为double类型

这样啊,谢谢!!!
回复 使用道具 举报
这个是数据类型知道提升的问题。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马