=,* =,/ =复合赋值操作符需要转换吗?
直到今天,我认为,例如:
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);
链接地址: http://www.djcxy.com/p/211.html
上一篇: =, *=, /= compound assignment operators require casting?