Java中的+=等价于
不,它们不是以你表达的方式等价的。
short x = 0, y = 0; x -= y; // This compiles fine! x = x - y; // This doesn't compile!!! // "Type mismatch: cannot convert from int to short"
第三行存在问题,因为-
会对short
操作数执行所谓的“数字提升”(JLS 5.6),并产生一个int
值,不能简单地赋给一个short
,需要使用一个强制类型转换。复合赋值运算符包含一个隐藏的转换!
确切的等价性在JLS 15.26.2 复合赋值运算符中阐述:
E1 op= E2形式的复合赋值表达式等价于E1=(T)((E1)op(E2)),其中T是E1的类型,但E1只被计算一次。
所以为了澄清一些细微差别:
- 复合赋值表达式不会重新排列操作数
- 左边始终在左边,右边始终在右边
- 两个操作数都完全括起来以确保op具有最低优先级
int x = 5; x *= 2 + 1; // x == 15, not 11
- 存在一个隐藏的转换
int i = 0; i += 3.14159; // this compiles fine!
- 左边只计算一次
arr[i++] += 5; // this only increments i once
Java还有*=
、/=
、%=
、+=
、-=
、<<=
、>>=
、>>>=
、&=
、^=
和|=
。最后3个也适用于布尔类型(JLS 15.22.2 布尔逻辑运算符)。