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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jaijaiok 中级黑马   /  2013-12-10 15:31  /  2256 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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;  

为什么a和d是警告,而c是正确的呢

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

15 个回复

倒序浏览
本帖最后由 依然 于 2013-12-10 16:10 编辑

运行结果是只有b的结果会警告丢失精度。
a. byte b = 1 + 1;  这个算中是先执行1+1 结果为2,而把2赋值给b,所以正确(2可以在byte可以表示的范围内)。
b. byte b = 1; b = b + 1; 在执行b+1的时候会警告会丢失精度,因为b是byte类型,1是int类型,在进行加减等运算时候,jvm会先把b转换成int,int+1的结果也是int,把int类型赋值给byte会存在丢失精度。c. byte b = 1; b = b += 1;   运行过程是先b+1=2 后执行b=2,最后执行b=2.
d. byte b = 1; b = ++b; 运行过程是先++b,结果为2,而后b=2进行赋值,期间不存在int强转为byte的问题。


评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 雪飘舞 于 2013-12-10 16:34 编辑

我试了一下,只有b选项是错误的。
a. byte b = 1 + 1;  //1+1的结果也是2,2在byte范围内,应该是没有错误

b. byte b = 1; b = b + 1; //1默认的是int类型,当它与byte类型的b变量进行运算时,变量b会自动提升为int,那么它的结果也是int类型,将int类型值赋给byte类型的变量需要强制转换。

c. byte b = 1; b = b += 1; //与b中的不同之处在于这个计算只进行了一次运算,直接将结果赋值给了变量b,没有自动提升问题,所以是正确的。而b选项中则进行了2次运算:先求和(这里会有变量b的自动提升),再赋值

d. byte b = 1; b = ++b;  //计算结果为2(没有超出byte范围),我的运行很正常并没有报错

即:从低级别到高级别是系统自动转换的
       从高级别到低级别是需要我们自己进行强制转换的

另外,强制转换时需要注意运算后的结果是否超出了byte的范围。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
看了上面两个解答,有个疑问?
byte b=1+1;在运算过程中1+1不是两个默认的int型相加吗?所以运算结果2也是一个int型的;赋值给byte时同样有着从高级别向低级别转化.按这种思路应该会报错,但是只是警告,应该还有其他原因吧......

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
看了上面两个解答,有个疑问?
byte b=1+1;在运算过程中1+1不是两个默认的int型相加吗?所以运算结果2也是一个int型的;赋值给byte时同样有着从高级别向低级别转化.按这种思路应该会报错,但是只是警告,应该还有其他原因吧......

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 zeratel3000 于 2013-12-10 17:35 编辑

额。。。这不是基础测试题么。。。我曾经写的。。。
                byte a = 1 + 1;     //正确
                byte b = 1; b = (byte) (b + 1); //不正确,类型不匹配:不能从int型转换为字节型,强制类型装换一下就好了
                byte c = 1; c = c += 1; //c=c+1,再赋给c   
                byte d = 1; d = ++d; //++d表示在使用前d已经自加1,再赋值给d,则d无变化

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
Kyle 中级黑马 2013-12-10 19:43:53
7#
程洋 发表于 2013-12-10 16:53
看了上面两个解答,有个疑问?
byte b=1+1;在运算过程中1+1不是两个默认的int型相加吗?所以运算结果2也是一个 ...

因为在JAVA中有常量优化机制,在运行两个常量相加,即: 1 + 1 的时候,JAVA会自动优化运算,只要相加的常量不超过byte所能接收的范围,就会赋值给byte类型的b。
而byte b = b + 1,是一个byte类型的变量和常量1相加,byte类型数据在运算的时候会自动提升为int,与常量1相加,最后得到的是int数值,所以编译出错。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
.Mr 中级黑马 2013-12-10 19:56:53
8#
第一,我们需要明确byte是一个字节,int是4个字节,类型之间有转换的关系
对于a选项,就算了int型的1+1等于2在byte字节中,byte = byte(1+1)的话警告就没了
对于b选项,右边b是1个字节的”b“去加上4个字节的“1”,你把4个字节想赋给一个字节,通俗的讲小罐子装不了大罐子。
对于C选项,直接将右边复制给了b,没有转型问题
对于D选项,警告的话加个byte如同B选项

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
b+=:隐藏了强制类型转换。就是把原本(b+1)的int型强制转为byte了。
回复 使用道具 举报

  1. a. byte b = 1 + 1;     
  2. b. byte b = 1; b = b + 1;
  3. c. byte b = 1; b = b += 1;   
  4. d. byte b = 1; b = ++b;  
复制代码


第一个 b是byte类型的 而1+1是int类型的
第二个 b是byte类型的 b+1在运算时自动提升为int类型 所以报错
第三个 b是byte类型的 b+=1 +=就含有强制转换类型的功能 所以对的
第四个 b是byte类型的 ++b是int类型

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
barlay 中级黑马 2013-12-12 21:35:01
11#
Kyle 发表于 2013-12-10 19:43
因为在JAVA中有常量优化机制,在运行两个常量相加,即: 1 + 1 的时候,JAVA会自动优化运算,只要相加的 ...

就Kyle说的对,其他人的回答都有问题。
回复 使用道具 举报
a. 编译时已经知道b的实际值,并且是安全值,所以没问题
b. 同样道理,编译器不知道b+1的具体值,存在类型转换风险,需要程序员显式地进行强制类型转换,并由程序员承担可能存在的风险
c. +=运算并非产生一个新值再赋给b,而是直接在原始值上改变(类似于++或--运算),具有自动类型转换的功能,试试看将+=1改为+=1.2试试
d. 语法上没什么错误,但没有意义,因为++b是先b自增,然后再赋值,即将自己赋给自己,类似于int a =2; a = a; 是没有意义的。但如果改一下变成 b = b++; 情况就不同了,右边b先将值赋给自己然后再自增,b还等于初始值,右边自增后的那个b去哪了,我也不知道,但这样改后警告提示确实是没有了。

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
zeratel3000 发表于 2013-12-10 17:28
额。。。这不是基础测试题么。。。我曾经写的。。。
                byte a = 1 + 1;     //正确
                byte b ...

那你这题对了没,答案是acd吗
回复 使用道具 举报
jaijaiok 发表于 2013-12-12 23:09
那你这题对了没,答案是acd吗

额。。。他给了我十分。。。应该算对了吧,把自己的理解,道理讲清楚就好,我就是把我写的原模原样贴上来。。。
回复 使用道具 举报
在java运行时,会有一个自动类型转换 byte 和 int 运算时 都会提升为int类型
       
        a        是正确的
       
        b         是错误的 b = b+1; b是字节类型,1是int类型                 
                byte 是 一个八位 1是整数 是四个八位 byte和int相加 由小的转化为大的
                 b是 不确定的 所以byte类型自动会转化为int类型  然后赋值给byte类型 会报损失精度
                 如果需要使用则使用类型强制转换 byte b = 1;b = (byte) (b + 1);
       
        c        是正确的 b+=1 是在前面已经做了强制转换
       
        d        是正确的
                                        ++b 已经把1进行了强制转换
                                        ++b     [byte] b = [byte] b + [byte] 1                                       
                                        b=b+1   [byte] b = [byte] b + [int] 1

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
byte a=1+1;//正确   定义byte型的变量a时,会自动将右边的数值自动完成了强转
  byte b = 1; b = b + 1;   //编译失败,错误。这是数据类型转换,b是byte型,1默认是int型,运算结果是int型,赋值给byte型的b变量可能损失精度。
  byte c = 1; c = c += 1;  //正确。首先,c+=1中+=运算符在给c赋值时,自动完成了强转操作。最后将运算后的c赋值给c。
  byte d = 1; d = ++d;    //正确。首先,先运算++d,该运算是先将d加一后的结果赋值给d,在赋值过程自动完成了强转操作。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马