若是你认为表达式(x += i)只是表达式(x = 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),因此是正确的。html
转载:http://hi.baidu.com/lifa868/blog/item/b7c05b2bc6a97a91023bf6f3.html# _腳步淩亂post