积跬步,聚小流------关于数据类型转换的一个面试题

假期眼见着就要结束了,假期前指定的计划也只是完成了个大概,有点沮丧,不过也挺开心,因为跟家人一起过的很开心。

在假期里回顾总结的时候,碰到这样一个大家都很熟悉的问题:

short s=1;s=s+1;

short s=1;s+=1;

当时的问题是哪一个是正确的,相信很多都能很快回答出来是第二个,因为第一个没有强制转换,而第二个中1是增量,是正确的。

但是,稍微一迷糊,s+=1的实质应该是什么呢?

记得当时我询问了很多人,虽然大过年的整的大家都很不爽,哈哈,但是却得到不同的结果:

第一类人:s+=1<==>s=(short)(s+1);

第二类人:s+=1<==>s=s+(short)1;

刚开始从网上搜索答案,很多人也都是直接给出了第一类的结果,而对于第二类我竟然无言以对,难道不对么?

于是测试了一下

结果发现报错了

而事实上,如果在IDE中进行编写,会发现有错误存在,无法进行编译

到这一步的时候,至少我们可以确定s+=1的实质应该是s=(short)(s+1),也就是所谓的“复合赋值运算与简单赋值运算的区别在于复合赋值运算会将运算结果隐式转化成为运算符左边的类型”,因为另一种根本上就是错误的,但是我们还需要考虑一个问题,它怎么会错误呢?

至于原因,我们倒不妨记住:short+short,甚至于byte+byte得到的结果都是int,简单点记得话就是,加数如果存在long,那么结果就是long,如果不存在,那就都是int,而查到的比较认可的解释就是:考虑到short和byte容易溢出的或者其它性能问题,编译器会将这类精度比较小的转换成为int后再进行运算,那结果肯定是int的,s=s+(short)1是毫无意义的,它的本质还是s=(int)s+1,还是需要进行强转才能赋值给s。

几个哥们都说别纠结这个啦,难道是过年时间对我问题的不爽,哈哈,不过解决了这个问题感觉还挺高兴的,嘎嘎,新年快乐,新年加油

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值