一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 类型转换之隐式转换
RSS订阅
类型转换之隐式转换
发表时间:2006-07-20 00:09:42 关键词:C++,MFC,VC,Primer,编程,教程,读书

  对于我们来说,3+1.5=4.5。但是对于计算机来说,这两个数的相加可不这么简单。因为3与3.0是不同的数据类型,3.0与1.5是可以相加的,3却不能与1.5相加。于是,C++在对上面的表达式进行处理时,有必要对其中一个(或两者)进行转换。
  因为这个转换是“隐式”的,也就是说这个转换不让程序员知道,那么,系统就不能必须保证不产生损失,这个损失指的是精度。为了不损失精度,数据总是向精度高的类型转换。惟一的例外是当某个变量用作条件时,它被转换为bool型。
  对算术类型的转换是这样的:所有比int小的都转为int或unsigned int,即使没有必要也这么转。原因很简单,因为int的长度正好等于字长。对CPU来说,一次处理一个字是最快的。如果int或unsigned int无法达到要求,则往long、double转化。
  如果每一个转换都能不造成损失,那自然是好事。可是世间的事总有不随人愿的时候。对于同一种算术类型,其signed和unsigned所能表达的范围是一样大,但却是互不重叠的两个范围。就像“妇联”和“工会”一样,往哪边转换都可能会产生损失。这是无法解决的问题,所以,在VC中,试图比较int和unsigned int变量时会显示警告。
  奇怪的是,据我测试,在VC++.net中,只有进行“<”和“>”比较的时候才会显示警告,而进行“==”和“!=”比较的时候却不显示警告。实际上这两个比较也会有同样的问题产生,比如以下代码:
int a = -3;
unsigned b = 4294967293;
if (a == b) cout << "yes" << endl;
  测试运行以上代码会发现表达式a==b的值为true。这是从int转为unsigned int过程中的副作用,这个副作用我们应该知道,但是VC++.net不进行任何警告似乎也有些与理不通。——难道我关闭了某些警告?
  其它隐式转换还包括数组名转换为指针、算术值用作条件时转换为bool,枚举被转换为整数,非const对象转换为const对象等。其中枚举转换为整数没什么要提的,枚举值本来就是整数的别名,非const对象转为const对象只是临时声明它的保护级别,通常用于作为参数传递时。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!