黑马程序员技术交流社区

标题: 编译为什么一个通过,一个不通过? [打印本页]

作者: 夏日蓝雪    时间: 2014-6-5 11:19
标题: 编译为什么一个通过,一个不通过?
本帖最后由 夏日蓝雪 于 2014-6-6 10:35 编辑

Byte b=10;
b=b+1;//编译不通过
b+=1;//编译通过
”b=b+1“与”b+=1“不是一个意思吗?为什么一个可以通过,一个就不能通过编译呢?它们在编译时有什么区别吗?
作者: 榨菜    时间: 2014-6-5 11:54
本帖最后由 榨菜 于 2014-6-5 11:56 编辑

1 默认是int的类型 。因为保存到byte中,所以需要强制类型。
作者: 西门吹风    时间: 2014-6-5 12:05
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这个过程。至于底层如何赋值就不清楚了。


作者: 上杉    时间: 2014-6-5 12:10
楼上说的我觉得是对的,但是byte取值范围不是-128~127,按道理说1也可以算是byte类型啊,为什么1必须要算到int类型里呢?
作者: 李小然    时间: 2014-6-5 12:21
上杉 发表于 2014-6-5 12:10
楼上说的我觉得是对的,但是byte取值范围不是-128~127,按道理说1也可以算是byte类型啊,为什么1必须要算到 ...

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

作者: 夏日蓝雪    时间: 2014-6-6 10:27
Crystal静新 发表于 2014-6-5 13:53
其实这个问题你看下.class反编译后的源代码就知道了,建议你下载一个java反编译的软件,有些问题你可以通过 ...

谢谢!这个方法不错!
作者: 夏日蓝雪    时间: 2014-6-6 10:29
西门吹风 发表于 2014-6-5 12:05
Byte b=10;
b=b+1;
这里b=b+1相当于执行了两次运算,一是b+1,由于1是int型,在运算过程中b的类型会自动提 ...

“b+=1只执一赋值运算”这应该是问题的关键。谢谢,学习了!
作者: 姿_`态    时间: 2014-6-6 10:43

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型,所以不会出错,关键是他有一个自动转换动作。
作者: 黄宝宝    时间: 2014-6-6 14:54
首先 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-6 16:58
李小然 发表于 2014-6-5 12:21
整数都默认为int类型
小数都默认为double类型

这样啊,谢谢!!!
作者: 黄梁梦想享    时间: 2014-6-6 19:00
这个是数据类型知道提升的问题。




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