public class Test {
public static void main(String[] args) {
short i = 1;
i = i + 1;
System.out.println(i);
}
}
无法运行报错
Test3.java:4: 可能损失精度
找到: int
需要: short
                i = i + 1;
                      ^
1 错误
但是我把i = i + 1改成i+=1;就能通过编译且能运行成功,这是为什么呢???i = i + 1和i+=1不是一个意思吗???

解决方案 »

  1.   

    i = i + 1  i是short 1是int 会损失精度i+=1  会自动处理吧
      

  2.   

    short i = 1;
    i = i + 1;   
    i + 1运行结果是int类型,需要强制类型转换
    i+=1进行运算时将自动地执行窄化原始类型转换
      

  3.   

    在这里可以理解为
    i+=1会自动把1转成short来运算
    i+1不会这么做,这个计算的结果是int,所以再赋值给short类型变量需要强制类型转换
      

  4.   

    i = i + 1需要强制转型,i+=1不用
      

  5.   

    int->short需要强制转换类型,
    i=(short)(i+1);or
    i+=1;
      

  6.   

    谁都知道 i=i+1需要强制转换,i+=1不需要强制转换,关键是为什么i+=1不用?i+=1中的1是否被转换为short类型了?
      

  7.   

    楼主可以查下关于类型转换的知识,当两个数值进行二元操作时,比如加减乘除运算(a+b),规则如下,依顺序来:
    1. 若进行运算的数值中有一个是Double型,则最后的结果为Double
    2. .......................Float................Float
    3. .......................Long.................Long
    4.否则,最后的运算结果都是int型
      

  8.   

    我的理解:
    当你用i+1作运算的时候,1的默认类型是int,所以计算的结果结果为2,编译器会向默认向类型大的一方转换如:short->int->long ,所以报错原因也就明确了。
    其次:i+=1这里只操作的是一个变量i,所以会在i原有的类型上进行操作。  
      

  9.   

    i = i + 1; i被转换为INT型,属于向上转型,需要强制性,i+=1;这个是java语法规定的写法,在内部已经帮你做了默认的操作