黑马程序员技术交流社区

标题: 关于byte b=1;b=b+=1;的疑问 [打印本页]

作者: 深圳在漂移    时间: 2013-7-19 13:42
标题: 关于byte b=1;b=b+=1;的疑问
以下代码哪个是正确的?为什么?
a. byte b = 1 + 1;     
b. byte b = 1; b = b + 1;
c. byte b = 1; b = b += 1;   
d. byte b = 1; b = ++b;  

  我知道:第一个是对的,定义b为byte型,且值为2;第二个是b+1为byte加int类型结果为int类型,把int类型赋值给byte类型的b会产生编译错误,精度丢失; 但是第三个和第四个是为什么呢?

作者: tonygone    时间: 2013-7-19 13:45
a,c,d正确;
选项b中,b+1的结果默认转换为int型,int型不能直接转换为byte型,需强制转换。应改为:byte b=1;b=(byte)(b+1);
选项c中,b+=1包含了一个隐藏的类型转换,相当于 b=(byte)(b+1);
选项d中,b=++b也包含了一个隐藏的类型转换
作者: xscn    时间: 2013-7-19 13:57
我举个视频里的例子哈
short s = 3;

s=s+2;

s+=2;
有什么区别?

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

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


作者: 平凡的小草    时间: 2013-7-19 15:21
2楼 正解
作者: wedge    时间: 2013-7-19 15:24
这是隐式转换和强制转换的问题。
作者: 深圳在漂移    时间: 2013-7-19 15:25
xscn 发表于 2013-7-19 13:57
我举个视频里的例子哈
short s = 3;
s=s+2;

那么我里面的a,b,c,d哪个对,哪个不对呢?具体原因是?
作者: 深圳在漂移    时间: 2013-7-19 15:26
tonygone 发表于 2013-7-19 13:45
a,c,d正确;
选项b中,b+1的结果默认转换为int型,int型不能直接转换为byte型,需强制转换。应改为:byte ...

讲得很详细,谢谢~
作者: xscn    时间: 2013-7-19 16:07
本帖最后由 xscn 于 2013-7-19 16:09 编辑
深圳在漂移 发表于 2013-7-19 15:25
那么我里面的a,b,c,d哪个对,哪个不对呢?具体原因是?

你的abcd,ab你不是知道原因了吗??
我举的例子就是为了说明你的b,c的区别
你例子里cd都是一次运算,包含了一个隐性的数据强制转换

作者: 深圳在漂移    时间: 2013-7-19 16:14
xscn 发表于 2013-7-19 16:07
你的abcd,ab你不是知道原因了吗??
我举的例子就是为了说明你的b,c的区别
你例子里cd都是一次运算,包 ...

明白了,谢啦!
作者: 王会涛    时间: 2014-12-11 19:51
为什么我感觉第一个也是错的啊
作者: 王会涛    时间: 2014-12-11 20:16
为什么我感觉第一个也是错的啊
作者: 李右庭    时间: 2014-12-12 21:47
迷迷糊糊的进来迷迷糊糊的懂了然后迷迷糊糊的走人
作者: 女神从来不加班    时间: 2015-3-4 20:22
王会涛 发表于 2014-12-11 19:51
为什么我感觉第一个也是错的啊

第一个1+1是显式的赋值 并且值在byte的范围内
作者: 女神从来不加班    时间: 2015-3-4 20:25
xscn 发表于 2013-7-19 13:57
我举个视频里的例子哈
short s = 3;
s=s+2;

大神 这个隐式转换是怎么来的? 是++的运算自己的特性吗?
作者: 12300123    时间: 2015-4-15 23:40
tonygone 发表于 2013-7-19 13:45
a,c,d正确;
选项b中,b+1的结果默认转换为int型,int型不能直接转换为byte型,需强制转换。应改为:byte ...

讲的好。都忘了。
作者: kingowe    时间: 2015-5-18 09:59
不错,谢谢楼主的提问
作者: 不走回头路    时间: 2015-6-13 20:49
这个终于明白点了
作者: adglo    时间: 2015-7-3 22:11
要说二次运算的话会类型转换,a选项中1+1两个都是Int型,结果2也应该是int型才对,那它就不能赋给byte型的变量b才对,我哪想错了吗?
作者: shibolin12345    时间: 2015-8-27 23:31
{:2_30:赞一个!
作者: 学不死往死学    时间: 2015-10-18 20:44
a 为什么是对的呢? 不是默认int类型吗?  难道也是隐藏包含强制转换?
作者: feng_ye    时间: 2015-10-18 22:37
acd都正确
作者: 小笨笨天    时间: 2015-11-11 22:29
确实  这块看来还是不怎么清楚
作者: Nexusunsky    时间: 2016-1-3 22:44
不错,学习了!




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