复合赋值操作符有:
+=、-=、*=、/=、%=、 <<=、 >>=、 >>>=、&=、 ^=和| = ;
简单赋值操作符为
= ;
在java中我们一直认为
i += j;
是下面的一种简写形式
i = i + j;
但是当我们尝试编译如下代码时
int i = 5;
long j = 8;
i=i+j;
i+=j;
但是i=i+j;
会报错,不会成功编译,但是i+=j;
不会报错,可以成功编译
这是为什么呢?
这是否意味着实际上i+= j
; 这样的简写实际上是这种形式 i=(type of i) (i+j)?
像这个问题一样,Java的JLS持有答案。 在这种情况下,JLS的§15.26.2对复合赋值运算符进行了详细阐述。 摘录:
A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.An example cited from §15.26.2
For example, the following code is correct:
short x = 3;
x += 4.6;
and results in x having the value 7 because it is equivalent to:
short x = 3;
x = (short)(x + 4.6);
Java 语言规范中讲到,复合赋值 E1 op= E2 等价于简单赋值 E1 =(T)((E1)op(E2)),其中 T 是 E1 的类型,除非 E1 只被计算一次。换句话说,复合赋值表达式自动地将它们所执行的计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原始类型转换。
相关连接
Java解惑 复合赋值与简单赋值
Java JLS 官方对此问题的说明