Java 之复合赋值运算符

 1.引入问题

  切入正题,看下面代码,结果应该是怎么样的

public class App{
    public static void main( String[] args ){
    	
    	byte a=1 ;
    	int b = 10;
    	 a= a+b;
    	 
    	System.out.println(a); 
    	
    	a+=b;
    	System.out.println(a);
    }
}

  这段代码的执行结果是什么??

 

2. 执行结果

。。。。。。。。。。。。。。。。。。。答案如下。。。。。。。。。。。。。。

上面的代码的编译的时候会报错,编译失败。因为在函数内部第三行中,左边的a是byte类型,右边的a是byte类型 b是int类型,当a和b相加的时候就会进行类型提升。导致a+b的结果是int,把一个int型的值赋值给一个byte类型的时候自然会报错。但是a+=b;这行代码却是可以正常执行的,这是为什么呢?

 

3. 结果分析

  关于第三行报错的原因上面已经说过了,但是a+=b;能够正常执行的原因是什么呢?根据JLS(Java语言规范)指出,复合赋值运算符表达式 E1 op= E2 等价于 E1 = (T)((E1) op (E2)) 其中T是E1的类型,但E1只会被求值一次。也就是说上面a+b的执行过程是这样的,a = (byte)(a+b);在赋值的时候发生了强制转换,所以是可以正常编译通过的。这样就解释了上面编译的结果了。

posted on 2015-10-30 16:16  叼烟斗的纤夫  阅读(1220)  评论(0编辑  收藏  举报