为什么 Java 增量运算符允许在没有显式强制转换的情况下缩小操作的范围?

2022-09-01 13:22: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


答案 1

这在 JLS #15.26.2 中定义:

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

换句话说,隐式执行演员表。i += lng


答案 2

i += lng;复合赋值运算符隐式强制转换。

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

来自 JLS

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


推荐