C++分析研究  
C++
日历
<2014年1月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 92
  • 文章 - 4
  • 评论 - 4
  • 引用 - 0

导航

常用链接

留言簿

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
  所谓隐式类型转换,就是定义的不同类型的数据在运算时,由编译器自行转换撑同一数据类型后再进行运算,而完全无需程序员介入的过程北美托福答案
 
   很多时候在笔试面试时可能被问到这样一些类似的问题,比如:
 
   1 int a = 0;
 
   2 a = 3.1415926+3;
 
   3 cout<<a<<endl;
 
   4
 
   5 输出是什么?
 
   当然这是小儿科,很直白的问法,一般都能反应过来,输出为6,因为在计算时,首先编译器将3转换为double类型,然后执行浮点数加法操作,得到6.1415926;又因为变量a为整型,这是无法改变的,所以编译器只能丢失一部分数据,从而将6赋值给a。
 
   可是有时候就不那么直接了,比如下面这道题,一开始没看到提示的时候,我就没想这回事雅思答案
 
   void fun()
 
   {
 
   unsigned int a = 2013;
 
   int b = -2;
 
   int c = 0;
 
   while (a + b > 0)
 
   {
 
   a = a + b;
 
   c++;
 
   }
 
   printf("%d", c);
 
   }
 
   据说是小米的笔试题,问程序输出多少?
 
   貌似是1006?哈哈~那就完蛋了~~ :-)  在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循环中执行,无法跳出,所以什么也不能输出,不信去试吧托福答案
 
   其实这个题后来一想也还算好吧,敏感的人可能还是能注意到的,我要是考官,要考这个考点,我就在a,b的定义之后插些其他乱七八糟的程序,输出一些其他的信息,或者夹着别的东西一起考,让你感觉这里根本就没考点,让那个unsigned不那么明显,前后很远,你可能就想不起来这回事了~然后就乖乖往陷阱里跳了。是不是略贱?
 
posted on 2013-04-16 11:31 HAOSOLA 阅读(256) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © HAOSOLA Powered by: 博客园 模板提供:沪江博客
PK10开奖 PK10开奖