s = s + s 和 s += s 之间的区别在使用 short 类型时会有何影响?

9

我进行了一个小测试来操作一个 short,但是遇到了编译问题。以下代码可以编译:

short s = 1;
s += s;

虽然这个没有:

short s = 1;
s = s + s; //Cannot convert from int to short

我了解到shorts会自动转换成int,但这两种代码之间有什么区别?
1个回答

17
你说的没错,short 会被提升为 int。这发生在二进制运算符 + 的计算过程中,被称为 二进制数值提升
然而,使用复合赋值运算符如 += 就会将其效果抵消。JLS 的第 15.26.2 节指出:

形如 E1 op= E2 的复合赋值表达式相当于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只会被计算一次。

也就是说,它等价于强制转换回 short

我喜欢你的回答比我的更好,然后你得到了赞成票,我就把我的删掉了,干得好。 - Orel Eraki
1
@Patrick:复合赋值运算符还有另一种不同之处。显然,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接