然而,如果结果的类型比该变量的类型范围值要大(右侧的运算结果类型),那么复合赋值操作符将悄悄地执行一个强制类型转换。因此,我们有很好的理由去解释为什么在尝试着执行等价的简单赋值可能会产生一个编译错误。
为了说得具体一些,并提供一个解决方案给这个谜题,假设我们在该题的两个赋值表达式之前有下面这些声明:
short x = 0;
int i = 123456;
复合赋值编译将不会产生任何错误:
x += i; // 包含了一个隐藏的隐式转换!
你可能期望x 的值在这条语句执行之后是123,456,但是并非如此l,它的值是-7,616。int 类型的数值123456 对于short 来说太大了。自动产生的转型悄悄
地把int 数值的高两位给截掉了。这也许就不是你想要的了。
相对应的简单赋值是非法的,因为它试图将int 数值赋值给short 变量,它需要一个显式的转型:
x = x + i; // 不要编译——“可能会丢掉精度”