如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确。
这两个表达式都被称为赋值表达式。(x = x + i)表达式使用的是简单赋值操作符(=),而(x += i)表达式使用的是
复合赋值操作符。Java语言规范中讲到,复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2))),其中T是E1 的类型,
除非E1只被计算一次。 换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。
如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,
那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。
因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,
请不要将复合赋值操作符作用于byte、short或char类型的变量。 因为S1是short型的,
占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,
会发生自动类型的提升,要不然数据也装不下呀,是这个道理吧*_*。
也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,
把4个字节的东西放在两个字节的空间里,肯定编译不通过。
后面的那个不会发生类型的提升,
JAVA规范上说 【e1+=e2 实际上是 e1=(T1)(e1+e2) 】,
其中T1是e1的数据类型。
s1+=1等效于 s1=(short)(s1+1),所以是正确的。
如果哪有理解和书写错误,有劳各帅哥美女们指点下?不胜感激!
lc0356 发表于 2016-12-3 15:32
好文,顶一个。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |