为什么 Java 的 +=、-=、*=、/= 复合赋值运算符不需要强制转换?
2022-08-31 01:21:48
直到今天,我还以为例如:
i += j;
只是一个捷径:
i = i + j;
但是,如果我们尝试这样做:
int i = 5;
long j = 8;
然后不会编译,但编译会很好。i = i + j;
i += j;
这是否意味着实际上是这种事情的捷径?i += j;
i = (type of i) (i + j)
直到今天,我还以为例如:
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
[...]以下代码是正确的:
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'