我发现了Java 的 +=、-=、*=、/= 复合赋值运算符(好问题 :)),但它有一部分我不太了解。借用那个问题:
int i = 5; long l = 8;
然后
i = i + l;
不会编译,但i += l;
会编译得很好。
已接受的链接问题的答案指出:
E1 op= E2 形式的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。
这与仅评估一次的异常i += l;
相同。i = (int)((i) + (l));
i
Along
可能(IIRC 甚至可以保证)比 a 长int
,因此可以容纳更大范围的值。
鉴于这种情况很容易由于在语句执行期间的某个时间点进行必要的缩小转换而导致数据丢失(r 值表达式评估或赋值),为什么i += l;
不是编译时错误或至少是警告?