直到今天,我还认为,比如说。
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&。nbsp;= (T)((E1) op (E2))
,其中T
是E1
的类型,只不过E1
只被评估一次。
一个例子引自§15.26.2
[...]下面的代码是正确的。
short x = 3; x += 4.6;
,结果是x的值为7,因为它等同于。
short x = 3; x = (short)(x + 4.6)。
换句话说,你的假设是正确的。
非常好的问题。Java语言规范]1证实了你的建议。
例如,下面的代码是正确的。
short x = 3; x += 4.6。
并导致x的值为7,因为它等同于。
短x=3。 x = (short)(x + 4.6)。
你需要把 "长 "明确地转换成 "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.
但在+=
的情况下,它可以正常工作,因为运算符隐含地将右变量的类型转换为左变量的类型,所以不需要明确地进行转换。