4

考虑以下:

int a = 1;
double b = 0.5;
System.out.println(a += b);    // case x
System.out.println(a = a + b); // case y

显而易见的是,上面的代码甚至无法编译 - 案例 y 将由于“不兼容的类型”而失败。如果我自己运行 case x,它只会返回 a。

这里发生了什么?速记运算符 (+=) 是否“捕获”失败的赋值并默认简单地返回 lhand 值?如果是这样,那么声称 a += b 等价于 a = a + b 是否真的正确,这在教程中很常见?

4

2 回答 2

6

根据 Java 语言规范第 15.26.2 节,复合赋值运算符插入到左侧操作数类型的隐式转换:

二元运算的结果被转换为左手变量的类型,经过值集转换(第 5.1.13 节)到适当的标准值集(不是扩展指数值集),转换结果为存储到变量中。

分配a = a + b将要求强制转换是等效的:

a = (int)(a + b);
于 2013-11-07T21:27:43.700 回答
0

你有一个 double 和 int 值:

a += b is equivalent to a = (int)(a + b);
a = a + b is equivalent to a = a + b;

在后者中,您无法编译,因为您试图在不强制转换的情况下将 double 添加到 int 中。a += b 为你做演员。

于 2013-11-07T21:26:01.220 回答