问题
直到今天,我认为,例如:
i += j;
只是一个捷径:
i = i + j;
但是,如果我们尝试这样做:
int i = 5;
long j = 8;
然后i = i j;
不会编译,但是i = j;
会编译好。
这是否意味着实际上i = j;
是这样的一个快捷方式i =(类型i)(i j)
?
#1 热门回答(2194 赞)
像这些问题一样,JLS持有答案。在这种情况下,§15.26.2 Compound Assignment Operators。摘录:
形式为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 =(短)(x 4.6);
换句话说,你的假设是正确的。
#2 热门回答(438 赞)
这个演员的一个很好的例子是使用* =或/ =
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'
#3 热门回答(221 赞)
非常好的问题。 Java Language specification确认你的建议。
例如,下面的代码是正确的:short x = 3;
x = 4.6;
并导致x的值为7,因为它等价于:short x = 3;
x =(短)(x 4.6);