语法话题
本期的话题如下:
在Java中,a += b与a = a + b两条语句有什么不同?
对于Java初学者来说,可能认为二者是等价的,但实际上,二者还是有一定区别的。
这里,我们使用运算符+与+=来举例,不过,这种区别也适用于更通用的情况,可以认为是:a op= b与a = a op b的区别,其中op=可以是所有的复合赋值运算符:
+= -= *= /= %= <<= >>= >>>= &= ^= |=
区别1——隐式类型转换
设右侧操作数(表达式a + b)的类型为S,左侧操作数a的类型(目标类型)为T,当S与T赋值不兼容时:
- 对于a += b,能够执行一个隐式的类型转换,将a + b的结果类型(S)转换为a的类型(T)。
- 对于a = a + b,则不会执行隐式类型转换,而是产生编译错误。
程序示例如下:
package test;
public class Test {
public static void main(String[] args) {
short a = 0;
int b = 1;
// 可以。能够自动完成隐式转换。
// 相当于执行a = (short)(a + b)
a += b;
// 不可以,会产生编译错误。
// a = a + b;
}
}
区别2——求值次数
当左侧操作数a是通过数组引用来访问元素时(数组访问表达式),例如,x[0],其中,x为数组引用,0为元素索引,此时x[0](整体)就是操作数a: