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);在赋值的时候发生了强制转换,所以是可以正常编译通过的。这样就解释了上面编译的结果了。