29

可能重复:
Java += 运算符

在 Java 中,这是无效的(不编译),正如预期的那样:

long lng = 0xffffffffffffL;
int i;
i = 5 + lng;    //"error: possible loss of magnitude"

但这完全没问题(?!)

long lng = 0xffffffffffffL;
int i = 5;
i += lng;       //compiles just fine

这显然是一种缩小操作,可能会超出int范围。那么为什么编译器不抱怨呢?

4

3 回答 3

14

这是在JLS #15.26.2中定义的:

形式的复合赋值表达式E1 op= E2等价于E1 = (T) ((E1) op (E2)),其中T是 的类型E1,除了E1只计算一次。

换句话说,i += lng隐式执行强制转换。

于 2012-12-19T10:06:45.833 回答
5

i += lng; 复合赋值运算符 cast 的隐式。

i+=lng; 
is same as 
i = int(i+lng);

来自JLS

E1 op= E2 形式的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。

于 2012-12-19T10:05:37.060 回答
3

编译器不会抱怨,因为根据JLS §15.26.2。复合赋值运算符

形式的复合赋值表达式E1 op= E2等价于E1 = (T) ((E1) op (E2)),其中T是 的类型E1,除了E1只计算一次。

因此,

i += lng;

相当于

i = (int)(i + lng);
于 2012-12-19T10:07:29.853 回答