short s1=1;s1=s1+1;有什么问题?short s1=1;s1+=1;有什么问题?short s1=1,s2=1;short s3=s1+s2;有什么问题?

一、short s1=1;s1=s1+1;

这两句代码的s1=s1+1存在数据类型转换问题,表达式右边:s1是short型,1是int型(1会被自动归为int型),二者相加,首先s1会被自动转为int型,相加的结果也就为int型。然而表达式的左边:s1是short型。此时就需要把表达时的右侧的数据类型强制转换为shor型,所以s1=s1+1;存在问题,会报出编译错误,正确的写法应该是s1=(short)(s1+1);

二、short s1=1;s1+=1;

首先说一下,这两句代码没有编译错误,结果也是正确的,那么,

有些人看到这两句代码会说,这个和刚才不是一样的吗,如果简单的认为s1+=1和s1=s1+1完全相同,那就错了。java语言规范中关于复合赋值的解释是这样的:E1 op=E2等价于

E1=(T)(E1 op E2),这里的T是E1的数据类型,看到这里 ,大家应该豁然开朗了,原来这个复合赋值是自带了隐式的强制类型转换的。

三、short s1=1,s2=1;short s3=s1+s2;

这两句代码也有编译错误,有些人会说了,难道同类型的数据还需要类型转换?答案是否定的,那么这里为什么会有编译错误呢,报错的原因主要是从数据安全方面考虑的,s1+s2的默认类型是int,因为如果s1的值接近short类型取值范围的最大值,同时s2的值也接近short类型取值范围的最大值,那么s1+s2的肯定超出了short的取值范围,此时二者之和就是int型的数据,此时就需要强制把左边的int型数据转换为右边的short型。有些人又说了,我明明写的s1为1,s2也为1,那为什么还报错。因为此时还不知道s1和s2的值到底是多少。所以这两句代码正确的写法应该是short s1=1,s2=1;short s3=(short)(s1+s2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值