【发布时间】:2014-02-14 09:31:21
【问题描述】:
我做了一个小测试来操作short,我遇到了一个编译问题。
以下代码编译:
short s = 1;
s += s;
虽然这个没有:
short s = 1;
s = s + s; //Cannot convert from int to short
我读到shorts 会自动升级为int,但这两个代码有什么区别?
【问题讨论】:
我做了一个小测试来操作short,我遇到了一个编译问题。
以下代码编译:
short s = 1;
s += s;
虽然这个没有:
short s = 1;
s = s + s; //Cannot convert from int to short
我读到shorts 会自动升级为int,但这两个代码有什么区别?
【问题讨论】:
short 升级为 ints 是对的。这发生在二元运算符+ 的评估过程中,它被称为二元数值提升。
但是,这可以通过+= 等复合赋值运算符有效地消除。 Section
15.26.2 of the JLS 状态:
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 相同。