如下面的程序
class Test
{
    public static void main(String args[])
    {
        short s=1;
        s=s+1;
        s+=1;
    }
}
中s=s+1不对,但s+=1却可以通过,为什么?

解决方案 »

  1.   

    s=s+1;首先将计算结果自动转换成int型的数据了。
      

  2.   

    +=之类的运算符隐含强制转换。
            s+=1;
      ==
            s=(short)s+1;
      

  3.   

    s = (short)(s + 1);
      

  4.   

    我是这样理解的:“1”这个常量,编译器在处理的时候是有一定智能性的,可以根据上下文,把它理解成“int 常量”或者是“short 常量”。对于“赋值运算符(=)”,编译器按照被赋值变量的类型来理解“1”的类型;对于“累加赋值运算符(+=)”也是这样处理。所以语法上就没有问题了(不需要强制转换)。对于“加法运算符(+)”,编译器总是把“1”当作“int 常量”来理解,所以 s+1 的结果是一个“int 型值”,所以 s=s+1 就需要强制转换了。
      

  5.   

    s为short型, 经过s+1之后自动转化为int型了,应改强制转化为s = (short)(s + 1);就可以了!
      

  6.   

    s=s+1 s是short 1是int所以报错s+=1  是强制转换成int
      

  7.   

    s=(short) (s+1);
    这么写就对了
      

  8.   

    同意imA(男的不会,会的不男)的說
      

  9.   

    只要看看jvm指令就可以很容易理解了:
    public class Test {    public static void main(String[] args) {
            short a = 1;
            a += 1;
        }}
    它对应的jvm代码如下:
    0:   iconst_1     //将int型常量1加载到操作栈(即short a = 1;中的1)
    1:   istore_1     //将操作栈中的值存储到变量(即存储到变量a中,a完成了初始化)
    2:   iload_1      //将变量(即a)的值加载到操作栈
    3:   iconst_1     //将int型常量1加载到操作栈(即 a += 1;中的1)
    4:   iadd         //将操作栈中的两个值相加
    5:   i2s          //将结果转换为short
    6:   istore_1     //将结果存储到变量(即存储到变量a中,a完成了运算)
    7:   return      //方法结束返回。
    第5行的代码执行了一个强制向下转型。
      

  10.   

    其中第2行:iload_1 在加载变量的时候执行了一个隐式向上转型(short-->int)
        第4行:执行的是两个int型的加法运算。
    所以第5行:要向下转型。