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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 明月几时有 中级黑马   /  2013-11-18 13:11  /  1386 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

4、 以下代码哪个是正确的?为什么?
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;
关于这样的题,记得老师以前说 会损失精度,强转,自动类型提升,常量优化机制,,等等原因
可这四个都分别该怎么解释呢           

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

8 个回复

倒序浏览
这是基础测试题,我做过。A正确
B选择中的b是byte型 b+1中的1是整形,所以想家会损失精度。
C 是把b+1的值付b 跟B选项类似
D是++b           [byte] b = [byte] b+ [byte] 1  应该是这种形式 需要强制转换
回复 使用道具 举报
╰ゝ冷筱柔 发表于 2013-11-18 15:26
这是基础测试题,我做过。A正确
B选择中的b是byte型 b+1中的1是整形,所以想家会损失精度。
C 是把b+1的值 ...

呃 只有B是错误的 小心误导楼主了
回复 使用道具 举报
a. byte b = 1 + 1;                 //正确,常量优化机制:编译器会把 byte b = 1 + 1编译成 byte b = 2;只要不超过-128至正的127就可以通过。
b. byte b = 1; b = b + 1;      //编译错误,损失精度。byte、char、short的变量会转换为Int类型进行运算,得出的结果也是Int。int类型的赋值给byte类型的会损失精度。
c. byte b = 1; b = b += 1;   //正确,+=赋值运算符隐含了一个强制转换,他会将结果转换为你接收的类型。
d. byte b = 1; b = ++b;    //正确,这个是c和a的组合体

byte b = 1;b=++b 等于 byte b = 1;b= b+=1; 等于 byte b2 = 1; b2=(byte)(b2+1);

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
A:1+1在编译时就能确定,而且在byte范围内 正确
B:b = b + 1;  b+1会自动提升为int类型 然后赋值给b,因为b是byte类型的,错误
C:b = b+=1;先进行b+=1,因为+=是java语言规定的运算符,java编译器会对它进行特殊处理,运行后还是原来的类型,赋值给b也正确,不用强转,正确
D:++和+=符号一样,正确
回复 使用道具 举报
误导楼主了,sorry,重新解释一下C选项。对于第一个运算,首先,byte b = 1;实际上这个值是编译器先进行了一次检查,范围在byte范围内,则编译通过,  
同时将1这个int类型的值在底层转化为了byte类型赋给了b;  
再说说b = b += 1;这个运算是将b += 1的计算结果赋给了b,所以我们只说b += 1的运算过程就行了,  
b += 1,其实等价于 b = (byte)(b+1);底层会对这个结果进行强转的,所以它编译的时候没事,如果b是127,  
那么加1后变成128了,成了int类型了,超过了byte类型的最大范围了,怎么办?这时候底层会强转,把int类型的  
前面三个高位丢弃,丢弃后,如果剩下的一位中,最高位为1,则取反加一,就成了负数了,如果最高位为0,直接把    值赋给b  
回复 使用道具 举报
在说D选项。
b = ++b,这个运算的过程是,先进行++b的运算,再把运算后的结果赋给b,++b计算后是一个int类型的,  
不管结果等于多少,底层会进行一个强转,也就是说++b就相当于 b = (byte)(b+1),所以这个编译也没有问题,
回复 使用道具 举报
感谢各位细心回答,我知道对错,就是不知道怎么说
回复 使用道具 举报
帖子已重新分类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马