积跬步,聚小流------关于数据类型转换的一个面试题
2015-02-25 10:16
274 查看
假期眼见着就要结束了,假期前指定的计划也只是完成了个大概,有点沮丧,不过也挺开心,因为跟家人一起过的很开心。
在假期里回顾总结的时候,碰到这样一个大家都很熟悉的问题:
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。
几个哥们都说别纠结这个啦,难道是过年时间对我问题的不爽,哈哈,不过解决了这个问题感觉还挺高兴的,嘎嘎,新年快乐,新年加油
在假期里回顾总结的时候,碰到这样一个大家都很熟悉的问题:
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。
几个哥们都说别纠结这个啦,难道是过年时间对我问题的不爽,哈哈,不过解决了这个问题感觉还挺高兴的,嘎嘎,新年快乐,新年加油
相关文章推荐
- 面试题: 看下面的程序是否有问题 如果有问题请指出 并说明 (关于数据类型-隐性转换的小陷阱)
- 关于一个c语言中的小陷阱(数据类型之间的转换)
- 关于基本数据类型转换的一个小问题
- 关于数据类型转换的补充知识
- 一个关于Java数据类型的有趣问题
- 关于数据类型Char(看了论坛的帖子后自己写的)——原来一个中文字在java中也是一个char
- DEMO[C#]TypeChange 关于类型转换的一个DEMO
- 关于数据类型转换的补充知识
- 在C#中将任意数值类型数据与字节数组相互转换的一个方法
- 今天在csdn上遇到一个问题,是关于sql数据行列转换的,我的写法如下:
- 关于2147217913 从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界 的问题解决方法
- 关于C#数据类型之间转换的问题!
- 关于C++和C#的自定义数据类型转换的一些思考
- 关于数据绑定的一个小小的总结:绑定数据到List类型的控件(RadioButtonList,ListBox等),双重绑定。
- BCB中Byte[]类型转换成AnsiSring类型数据的一个函数
- 关于java 基本数据类型之间的转换
- DEMO[C#]TypeChange 关于类型转换的一个DEMO
- 关于2147217913 从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界 的问题解决方法
- 关于C#数据类型之间转换的问题
- 关于数据类型转换