为什么Java的+=、-=、*=、/=复合赋值运算符不需要铸造?

直到今天,我还认为,比如说。

i += j;

只是一个快捷方式。

i = i + j;

但如果我们试试这个。

int i = 5;
long j = 8;

那么i = i + j;将无法编译,但i += j;则可以正常编译。

这是否意味着事实上i += j;是这样的一个快捷方式 i = (i的类型)(i + j)

解决办法

对于这些问题,JLS总是掌握着答案。在这种情况下§15.26.2 复合赋值运算符。一个摘录。

一个形式为E1 op= E2的复合赋值表达式等同于E1&amp。nbsp;= (T)((E1) op (E2)),其中TE1的类型,只不过E1只被评估一次。

一个例子引自§15.26.2

[...]下面的代码是正确的。

short x = 3; x += 4.6;

,结果是x的值为7,因为它等同于。

short x = 3; x = (short)(x + 4.6)。

换句话说,你的假设是正确的。

评论(12)

非常好的问题。Java语言规范]1证实了你的建议。

例如,下面的代码是正确的。

short x = 3; x += 4.6。

并导致x的值为7,因为它等同于。

短x=3。 x = (short)(x + 4.6)。

评论(4)

你需要把 "长 "明确地转换成 "int",如果 "i = i + l "的话,就可以编译并给出正确的输出。

i = i + (int)l;

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

但在+=的情况下,它可以正常工作,因为运算符隐含地将右变量的类型转换为左变量的类型,所以不需要明确地进行转换。

评论(1)