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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡玉勉 初级黑马   /  2013-7-30 11:24  /  2138 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-31 23:11 编辑

不知道技术测试的时候,是不是这道题错了
2、 以下代码哪个是正确的?为什么?
         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;
         
    答案:d
          低精度的可以向高精度的自动转换,运算时候称为隐士转换。
          高精度向低精度是需要强制转换。
          a.byte b =[int]1+[int]1
          b.byte类型和int类型做运算,byte类型默认向上转型,所以b+1的结果是int型
        将高精度的int型向byte类型的b赋值,需要强制类型转换。
        c.b=b+1同上

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

14 个回复

倒序浏览
b+1运算结果是int型,需要强制转换类型,所以b选项是错误的
回复 使用道具 举报
a,c,d好像都是对的。
a:因为byte取值范围是-128至127,1+1在其取值范围内,不损失精度,它会自动完成强制转换动作,所以可以进行运算。
b:b = b+1;运算后b是int类型
c:b = b += 1;它从右往左运算,实际上可以拆分成b +=1; b = 2;两步,因为+=运算符在给s赋值时,自动完成强转动作。
d:b = ++b;也是先计算++b 得出结果再给b赋值,++b在运算过程中自动完成强转动作。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
acd都可以。b会出现类型错误。
回复 使用道具 举报
怎么可能!a c d都对!!!只要还在byte范围内,就可以这么写,一点问题都没有。
回复 使用道具 举报
其实考的也就是强制转换类型的问题,楼上的都回复啦。
回复 使用道具 举报
王靖远 发表于 2013-7-30 13:05
acd都可以。b会出现类型错误。

能再具体点吗?虽然我敲代码的时候,acd是可以编译通过的,但是您看看我上面的分析,然后再给出具体的分析好吗?
回复 使用道具 举报
只说b选项。
b=b+1;
因为运算符右边是由变量b和常量1组成,那么在编译时期,虚拟机就不能知道表达式b+1的直接结果,那么就不能判断结果是否在被赋值的类型byte的范围内,所以编译不能通过。

和你一同进步!{:soso_e141:}
回复 使用道具 举报
王松松 发表于 2013-7-30 18:39
只说b选项。
b=b+1;
因为运算符右边是由变量b和常量1组成,那么在编译时期,虚拟机就不能知道表达式b+1的直 ...

我觉得你说得对,楼上的有些牵强
回复 使用道具 举报
b选项,左边是byte型,右边是int型所以出错了。acd都涉及到了自动转型。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 肖博文 于 2013-7-30 21:42 编辑

      //编译通过。等价于byte = 2;因为右边是常量,其值固定,若在byte型的范围内,编译器会自动完成强制转换;若不在范围内,则编译失败。
        byte b = 1 + 1;
        
        //编译失败。b是变量,编译器编译时并不会知道b具体是多少(编译时不会赋值,所以不知道b是多少),所以会认为b是所有可能的值,因此b+1不能通过编译。
        byte b = 1;
        b = b + 1;
        
        //编译通过。+=是一个赋值运算符,加和赋值是一步完成的,含有强制类型转换。等价于b = b = (byte)(b+1);
        byte b = 1;
        b = b += 1;
        
        //编译通过。++是自增运算符→自身加1再赋值给自己,加1和赋值也是一步完成的,且不会改变变量的类型(含有强制类型转换)。   
          byte b = 1;
          b = ++b;

以上的一些特点都是由java语言的规则决定的,只需记住这样的规则,不必追究为什么会有这样的规则。

评分

参与人数 3技术分 +2 黑马币 +3 收起 理由
郑先明 + 3 学习了!言简意赅!
杨兴庭 + 1
田磊阳 + 1

查看全部评分

回复 使用道具 举报
a,c,d 正确。
         a中,定义b为byte型,值为2.
         b中,b+1的结果默认转换为int型,int型不能直接赋值给byte型,需要强制转换。
         c中,b+=1包含了一个隐藏的类型转换,相当于b=(byte)(b+1);
          d中,b=++b也包含了一个隐藏的类型转换。b=可以去掉

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
经调试得....b选项错误
b为boolean型,在b=b+1时只找到int型...类型不匹配

{P~)@7Z$68HSK2V7O)3}96O.jpg (8.94 KB, 下载次数: 0)

{P~)@7Z$68HSK2V7O)3}96O.jpg

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 Mr_Free 于 2013-7-31 04:11 编辑

哥们,我也有这道题目,我是这样写的
  1. package com.itheima;

  2. /**
  3. * 第一题:以下代码那个是正确的?为什么?
  4. * a. byte b = 1 + 1;
  5. * b. byte b = 1;b = b + 1;
  6. * c. byte b=1; b= b+=1;
  7. * d. byte b= 1; b = ++b;
  8. * @author 谢伟光
  9. *
  10. *答:a,C,d是正确的。
  11. *分析:数据类型转换:分为自动类型转换和强制类型转换
  12. *数据类型的转换优先级是:double>float>long>int>byte,short,char
  13. *所以这里是优先级高的int类型转换为优先级低的byte类型,需要进行显示类型转换,也就是强制转换。
  14. *赋值运算分为2种:
  15. *1,等号右边全是由常量和运算符组成的表达式:因为都是常量,所以虚拟机在编译期就能知道表达式的结果,
  16. *并判断结果是否在被赋值的变量的类型范围内,如果在则直接赋值,如果不在则需要强制转换。
  17. *2,等号右边有变量参与运算:如果参与运算的变量是byte、short、char,它们会先转变为int类型,
  18. *再参与运算,类型总是会提升,言外之意就是一定要强转,你一定要手动写(byte)。
  19. *
  20. *
  21. *b 错是因为定义的是是byte类型的 所以是一个8位的数值范围,而b+1中这个1默认的为int型,
  22. *也就是说这个1为4个8位的数据类型,在2个不同数据类型进行运算时,数据范围小的数
  23. *据类型将自动转换成数据范围大的数据类型,所以,b+1之后的结果会被提升为int型,无法赋值给byte类型,而等
  24. *号前面的b是byte型的,jvm在编译的时候会报缺失数据精度的错误。
  25. *如果要改的话 可以改成  b. byte b = 1; b = (byte)(b + 1);
  26. *
  27. *在下面的代码中我会分析那些对的语句
  28. */
  29. public class Test1 {
  30. public static void main(String[] args){
  31.         byte a = 1 + 1;//1+1=2,因为等号右边是都是常量,所以虚拟机在编译期就能知道要表达式的结果,
  32. //          判断结果是否在被赋值的变量类型范围内,运算结果是2,在8位二进制取值范围也就是-128到127范围内的,
  33. //        不需要强转,所以是正确的。
  34. //        byte b = 1;b =  (byte) (b + 1);//这样改了之后b+1就强制从int型转换成byte类型了。
  35.         byte c = 1;c = c += 1;//这句话中c+=1只做了一个赋值运算,内部会做一个自动强转动作,结果存入C中,所以是正确的。
  36.         byte d = 1; d= ++d;//这句话就是执行了对内存中d进行加1操作后存入内存中的d,所以也不会出现数据类型被转换,所以也是正确的。
  37. //        总结:其实其他3个对的原因是他们都符合我前面说的赋值运算的第二种情况,而且运算结果都没有越界,所以编译通过。
  38. }
  39. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
向上转型,向下转型应该是形容的多态里面的子类对象的吧。基本数据类型类型转换也能这样形容?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马