黑马程序员技术交流社区

标题: 类型转换问题 [打印本页]

作者: 一直很安静    时间: 2013-11-12 09:48
标题: 类型转换问题
byte b=1;A.b=b+=1;B.b=++b;C.b=b++;哪个是正确的?为什么?
作者: Θ动@咚Θ    时间: 2013-11-12 10:17
首先第一步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 10:42
本帖最后由 不抛弃不放弃 于 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;

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


作者: 一直很安静    时间: 2013-11-12 11:14
不抛弃不放弃 发表于 2013-11-12 10:42
byte b=1;A.b=b+=1;B.b=++b;C.b=b++;哪个是正确的?为什么?

解释:

可是A显示是正确的
作者: 睡不够的猪    时间: 2013-11-12 11:27
都是正确的 这样写都相当于是做了一次运算,内部自动完成转换动作。

如果写成b=b+1就不可以了 这样就需要手动强转-->b=(byte)(b+1);
作者: 不抛弃不放弃    时间: 2013-11-12 11:36
一直很安静 发表于 2013-11-12 11:14
可是A显示是正确的

我知道了  我马上去修改一下 我那个帖子    你不说我还没注意到这个问题  你一说我想起来了 C是对的吧
作者: 黄炳期    时间: 2013-11-12 13:35
不抛弃不放弃 发表于 2013-11-12 10:42
byte b=1;A.b=b+=1;B.b=++b;C.b=b++;哪个是正确的?为什么?

解释:

理解有些偏了哦
作者: 不抛弃不放弃    时间: 2013-11-12 14:20
黄炳期 发表于 2013-11-12 13:35
理解有些偏了哦

亚希.....................
作者: 不抛弃不放弃    时间: 2013-11-12 14:24
看来我是理解错题意了     要说错的话 那个都没错  都能运行 我在回复的帖子中都说了




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