直到今天,我还以为:
i += j;
只是一个捷径:
i = i + j;
但是,如果我们尝试这个:
int i = 5;
long j = 8;
那么i = i + j;
不会编译,但i += j;
将编译好。
这是否意味着事实上i += j;
像这样的东西的快捷方式i = (type of i) (i + j)
?
和往常一样,JLS 都有答案。在本例中§15.26.2 复合赋值运算符 。提取物:
形式
E1 op= E2
的复合赋值表达式等效于E1 = (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);
换句话说,你的假设是正确的。
这个演员的一个很好的例子是使用 * = 或 / =
byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57
要么
byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40
要么
char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'
要么
char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'
非常好的问题。 Java 语言规范确认了您的建议。
例如,以下代码是正确的:
short x = 3; x += 4.6;
并且结果 x 的值为 7,因为它相当于:
short x = 3; x = (short)(x + 4.6);