Java规范有这样的规则:
- 高位转低位需要强制转换
- 低位转高位自动转.
short s1 = 1;
s1 = s1 + 1; 有什么错?
short s2 = 1;
s2 += 1;
short s1 = 1; s1 = s1 + 1;
有什么错?
s1是short型,1是short型,通过+运算符,计算的时候s1转换为int型,最后把s1+1赋值给s1的时候,s1是short型,所以出错。
short s1 = 1; s1 += 1;
有什么错?
如果你认为表达式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)
,所以是正确的。
网友评论