【发布时间】:2011-07-25 18:01:00
【问题描述】:
令我震惊的是,以下代码甚至可以在没有警告的情况下编译:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value += increment;
}
而正如您所料,这会产生编译时错误:
public void test()
{
int value = 2000000000;
long increment = 1000000000;
value = value + increment;
}
我查了一下,确实,JLS(第 15.26.2 节)有这样的说法:
E1 op = E2 形式的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了对 E1 求值 只有一次。
这对我来说似乎很荒谬。为什么他们觉得有必要在这里明确投射?似乎自动类型转换无论如何都会处理扩大,并且像这样自动缩小几乎肯定会导致整数溢出。
【问题讨论】:
-
好问题。对我来说从来没有多大意义。也许 James Gosling 会回应,因为他现在是 Google 员工,应该有很多空闲时间......
-
@squawknull - 是什么让您认为 Google 员工会在毫无意义的 SO 辩论上浪费他宝贵的“每周一天”? :-)
-
@Stephen C:这就是我今天的笑点。
标签: java integer-overflow compound-assignment