Java中,short s1=1;s1=s1+1;有什么错?short s1=1; s1+=1;有什么错?

因为byte、 short、 int 不会互相转换d,它们三者在计算时会转换成 int 类型。

而“+”是算术运算符,有算术运算符,就是已经在运算了,所以结果会转成int 类型。

如果把 int 类型的结果赋给 byte、short类型的结果,必须加上强制声明。 所以, 上面的第一个语句块,错在用“+”这个算术运算符运算后,结果变成了 int 型, 然后重新把计算结果赋给 short 型的变量时,没有强制声明值为 short的型的,所以会出错。 应该更改为: short s1 = 1; s1 = (short)(s1 + 1);

而第二个语句块,s1 += 1; 不会出错,因为“+=”是赋值运算符,不牵涉与其它类型的数字计算,也不会转成 int 类型的,所以没错。

注:

如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确。这两个表达式都被称为赋值表达式。

第二个表达式使用的是简单赋值操作符(=),而第一个表达式使用的是复合赋值操作符。
换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。
因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于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),所以是正确的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值