从一道面试题看C++隐式类型转换
2013-03-19 17:13
225 查看
所谓隐式类型转换,就是定义的不同类型的数据在运算时,由编译器自行转换撑同一数据类型后再进行运算,而完全无需程序员介入的过程。
很多时候在笔试面试时可能被问到这样一些类似的问题,比如:
当然这是小儿科,很直白的问法,一般都能反应过来,输出为6,因为在计算时,首先编译器将3转换为double类型,然后执行浮点数加法操作,得到6.1415926;又因为变量a为整型,这是无法改变的,所以编译器只能丢失一部分数据,从而将6赋值给a。
可是有时候就不那么直接了,比如下面这道题,一开始没看到提示的时候,我就没想这回事。
据说是小米的笔试题,问程序输出多少?
貌似是1006?哈哈~那就完蛋了~~ :-)
我是在http://51weixue.com/thread-51-1-1.html看到的,要不是楼主有提示:“此题有陷阱,作答需谨慎”,我根本就不可能反应过来。程序第六行a+b的运算,是两个不同类型的数运算,就不能都当做int类型直接相加了~~
在C++中定义的内置转换都按照尽可能防止精度丢失,例如,开头的浮点数和整数的运算,统一转换为浮点数进行运算;其他的,比如所有比int小的整型,包括char,short,unsighed char和unsigned short,如果该类型的所有可能的值都能包括在int内,他们就会被提升为int类型,否则将被提升为unsigned int类型。
而对于signed和unsigned int类型又有点特殊。表达式中的signed类型将会被转换为unsigned类型,坑啊!!~这时我们就好理解上面这个题了,a+b的计算结果是一个unsigned int类型,而unsigned int的表示范围是0~4294967295,所以就看看a+b有不有可能为0就行了,很显然,a=2013,每次减2,当减到为1时,unisigned int(1-2)就不是-1了,而是4294967295(因为负数是按补码表示的),因为a的初值是奇数,每次减2,永远不可能减成0,所以这个函数一直在while循环中执行,无法跳出,所以什么也不能输出,不信去试吧~
很多时候在笔试面试时可能被问到这样一些类似的问题,比如:
1 int a = 0; 2 a = 3.1415926+3; 3 cout<<a<<endl; 4 5 输出是什么?
当然这是小儿科,很直白的问法,一般都能反应过来,输出为6,因为在计算时,首先编译器将3转换为double类型,然后执行浮点数加法操作,得到6.1415926;又因为变量a为整型,这是无法改变的,所以编译器只能丢失一部分数据,从而将6赋值给a。
可是有时候就不那么直接了,比如下面这道题,一开始没看到提示的时候,我就没想这回事。
1 void fun() 2 { 3 unsigned int a = 2013; 4 int b = -2; 5 int c = 0; 6 while (a + b > 0) 7 { 8 a = a + b; 9 c++; 10 } 11 printf("%d", c); 12 }
据说是小米的笔试题,问程序输出多少?
貌似是1006?哈哈~那就完蛋了~~ :-)
我是在http://51weixue.com/thread-51-1-1.html看到的,要不是楼主有提示:“此题有陷阱,作答需谨慎”,我根本就不可能反应过来。程序第六行a+b的运算,是两个不同类型的数运算,就不能都当做int类型直接相加了~~
在C++中定义的内置转换都按照尽可能防止精度丢失,例如,开头的浮点数和整数的运算,统一转换为浮点数进行运算;其他的,比如所有比int小的整型,包括char,short,unsighed char和unsigned short,如果该类型的所有可能的值都能包括在int内,他们就会被提升为int类型,否则将被提升为unsigned int类型。
而对于signed和unsigned int类型又有点特殊。表达式中的signed类型将会被转换为unsigned类型,坑啊!!~这时我们就好理解上面这个题了,a+b的计算结果是一个unsigned int类型,而unsigned int的表示范围是0~4294967295,所以就看看a+b有不有可能为0就行了,很显然,a=2013,每次减2,当减到为1时,unisigned int(1-2)就不是-1了,而是4294967295(因为负数是按补码表示的),因为a的初值是奇数,每次减2,永远不可能减成0,所以这个函数一直在while循环中执行,无法跳出,所以什么也不能输出,不信去试吧~
相关文章推荐
- 从一道面试题看C++隐式类型转换
- 从一道面试题看C++隐式类型转换
- [C++再学习系列] 隐式类型转换与转换操作符operator T
- More Effective C++----(21)通过重载避免隐式类型转换
- c++ 类类型的隐式转换
- C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
- c++的隐式类型转换
- C++中显式和隐式初始化和类型转换
- C/C++隐式类型转换导致的若干问题
- C/C++的数值类型隐式类型转换
- [C++再学习系列] 隐式类型转换与转换操作符
- C++内置类型对象之间的隐式转换
- More Effective C++ 条款21 利用重载技术避免隐式类型转换
- C/C++隐式类型转换导致的若干问题
- C++ 隐式类类型转换和转换操作符
- c++隐式类型转换
- [C++再学习系列] 隐式类型转换与转换操作符operator T
- c++的转换构造函数和杜绝隐式类型转换的explicit关键字
- C++类型转换---隐式&显式
- C++ 类型隐式转换学习