我进行了一个小测试来操作一个 short
,但是遇到了编译问题。以下代码可以编译:
short s = 1;
s += s;
虽然这个没有:
short s = 1;
s = s + s; //Cannot convert from int to short
我了解到
shorts
会自动转换成int
,但这两种代码之间有什么区别?short
会被提升为 int
。这发生在二进制运算符 +
的计算过程中,被称为 二进制数值提升。+=
就会将其效果抵消。JLS 的第 15.26.2 节指出:
也就是说,它等价于强制转换回形如 E1 op= E2 的复合赋值表达式相当于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只会被计算一次。
short
。
x *= y + z;
并不意味着x = x * y + z;
而是x = x * (y + z);
。同样的,+
也是如此。x += y + z
的意思是x = x + (y + z)
,而不是x = x + y + z
。当您以这种方式使用+=
时,右侧加法会在左侧加法之前发生。在代数中,加法是可结合和可交换的,但计算机数学可能违反这些属性。x += y + z
的结果不一定与x = x + y + z
相同。 - Eric Lippert