分别判断下面的段代码,能否通过编译,为什么?int x = 2; byte b = 8; x = x + b;int x = 2; byte b = 200; x = x + b;int x = 2; byte b = 8; b = x + b;byte b = 2; b = b + 8;byte b = 2; b = (byte) (b + 8);byte b = 2; b = 2 + 8;byte b = 2; b = 2 + 128;byte b = 2; byte b1 = 3; byte b2 = 8; b = b1 + b2;int b = 2; byte b1 = 3; byte b2 = 8; b = b1 + b2;int b = 2; int b1 = 3; int b2 = 8; b = b1 + b2;int b = 2; int b1 = 3; int b2 = Integer.MAX_VALUE; b = b1 + b2;byte b = 2; b += 8;byte b = 2; b = b + 8;

解决方案 »

  1.   

     byte b = 2; b = b + 8; 
    b + 8; 结果是int,在赋值给b就错了
      

  2.   

    byte b = 2; b += 8; 不也是int,赋值给byte吗?
      

  3.   

    不是的,哥们,byte b=2; b = b + 8;Java对它运算是这样的:
    首先运算的是b+8,因为8为int型,所以结果运算出来的是10,会自动类型提升为int型,而现在把一个int型的10,赋给一个byte类型的变量,这时候如果不强制类型转换,就会报错了,因此编译不能通过。
    而b+=8,这和b+8不一样,“+=”在Java里是一种运算符,所以他不需要经过刚刚上面的类型转换,会自己内部运算出来一个byte类型的10,因此不会报错。楼主,懂了么?
      

  4.   

    +=最后还会有一步隐式的类型转换
    也就是说
    byte b = 2; b += 8;
    等价于 byte b = 2; b = (byte)b + 8;
    会自动转换成表达式左侧的变量类型~
      

  5.   

    默认的数字都是int ,所以第一个不会通过编译
    第二个可以,相当于 b =b+(int) 8;
      

  6.   

    好像是短的可以转换为长的,长的不能直接转为短的,否则会报错。故,byte = int 是会报错的,其他同理 。
      

  7.   


    是不是b=(byte)(b+8)?是b=(byte)(b+(byte)8)
      

  8.   


    是不是b=(byte)(b+8)?对
      

  9.   


    是不是b=(byte)(b+8)?是b=(byte)(b+(byte)8)将8转成byte有何意义?
      

  10.   

    A compound assignment expression(复合赋值表达式) of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.the following code is correct:short x = 3;
    x += 4.6;
    and results in x having the value 7 because it is equivalent to:short x = 3;
    x = (short)(x + 4.6);
    摘自stackoverflow
      

  11.   

    不能   将2赋值给byte b,b就成为int
      

  12.   

    byte b=2;
    b+=8;等价于b=(byte)(b+8);