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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一直很安静 中级黑马   /  2013-11-12 09:48  /  1128 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte b=1;A.b=b+=1;B.b=++b;C.b=b++;哪个是正确的?为什么?

评分

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

查看全部评分

9 个回复

倒序浏览
首先第一步b被设置为byte类型。b+=1的意思是b=b+1,这里后面的b是byte类型,加上int的1之后自动转换为int类型,再赋给byte类型的b,肯定出错。++b和b++的意思分别是先+1后取值和先取值后+1.先加1后,b就被转换为int类型了,赋给byte类型的b,肯定错。所以只有先取值再加1的b++是正确的。
回复 使用道具 举报
本帖最后由 不抛弃不放弃 于 2013-11-12 11:52 编辑

byte b=1;A.b=b+=1;B.b=++b;C.b=b++;哪个是正确的?为什么?

解释:
A. b=b+=1  就是 b=b=b+1  先运行最右边的 b+1,结果为int类型 ,而b是byte类型  int类型付给byte类型得强制转换,所以错误(这句解释我错了谢谢提醒, 在下面我给出新的解释,呵呵)

B. b=++b  就是b=(b+1) 结果为int类型 再赋给byte,所以错误,理由同上

C. b=b++  就是先进行赋值运算 b=b 然后b++ (b+1),因为b是byte类型 所以C是正确的

在运算的时候都可以运行,因为所有的值都没有超过byte的范围,个人愚见,有说错的地方可以指出来


重新解释: A .  b=b+=1;    首先我给你个小例子:  char x;    x=x-32; //error       x-=32; //right        这是什么原因呢?  如下:
          首先x-=32;包含了一个隐藏的类型转换! 而x=x-32;却没有隐藏的类型转换,需要自己强制转换,整数默认是int型的。
    许多人都认为以下的第一表达式(x+=i) 只是第二个表达式(x=x+i)的简写方式。(我以前也这样想的  呵呵。。).

     x+=i;   和  x=x+i;

    但是这并不十分准确。这两个表达式都被称为赋值表达式。第二条语句使用的是简单赋值操作符(=),而第一条语句使用的是复合操作符;
         复合操作符表达式会自动的将他们所执行的计算结果转换为左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值符将悄悄的执行一个窄化原始类型转换。
        而简单赋值操作符则不能完成自动类型转换,
呵呵  ,希望以上的讲解对你有所帮助!!!

回复 使用道具 举报 1 0
一直很安静 来自手机 中级黑马 2013-11-12 11:14:59
板凳
不抛弃不放弃 发表于 2013-11-12 10:42
byte b=1;A.b=b+=1;B.b=++b;C.b=b++;哪个是正确的?为什么?

解释:

可是A显示是正确的
回复 使用道具 举报
都是正确的 这样写都相当于是做了一次运算,内部自动完成转换动作。

如果写成b=b+1就不可以了 这样就需要手动强转-->b=(byte)(b+1);

点评

+1  发表于 2013-11-12 13:35
回复 使用道具 举报 1 0

我知道了  我马上去修改一下 我那个帖子    你不说我还没注意到这个问题  你一说我想起来了 C是对的吧
回复 使用道具 举报
不抛弃不放弃 发表于 2013-11-12 10:42
byte b=1;A.b=b+=1;B.b=++b;C.b=b++;哪个是正确的?为什么?

解释:

理解有些偏了哦
回复 使用道具 举报

亚希.....................
回复 使用道具 举报
看来我是理解错题意了     要说错的话 那个都没错  都能运行 我在回复的帖子中都说了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马