c++程序设计第2章基本数据类型与表达式(深入)_第1页
c++程序设计第2章基本数据类型与表达式(深入)_第2页
c++程序设计第2章基本数据类型与表达式(深入)_第3页
c++程序设计第2章基本数据类型与表达式(深入)_第4页
c++程序设计第2章基本数据类型与表达式(深入)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章程序的数据描述(1)--基本数据类型与表达式(深入话题)主要内容操作数的类型转换实数的“等于”与“不等于”比较短路求值带副作用的操作符的表达式计算左值表达式和右值表达式操作数的类型转换在C++中,进行运算前有时需要对操作数进行类型转换,对一些双目操作符,当两个操作数类型不同时,往往要把它们转换成相同类型,操作结果的类型一般与转换后的操作数类型相同。C++的类型转换方式有两种:隐式转换:由编译程序按照某种预定的规则进行自动转换。显式转换:由写程序的人在程序中用类型转换操作符明确地指出转换。不管是隐式转换还是显式转换,都不会改变被转换的操作数,转换得到的结果将存储在临时的存储单元中。隐式转换对于算术运算操作,当操作数类型为算术类型或枚举类型时,编译程序将在进行算术运算前按常规算术转换规则(usualarithmeticconversions)自动进行操作数类型的隐式转换。算术运算的结果类型与转换后的操作数类型相同。常规算术转换规则

(usualarithmeticconversions)如果其中一个操作数类型为longdouble,则另一个转换成longdouble。否则,如果其中一个操作数类型为double,则另一个转换成double。否则,如果其中一个操作数类型为float,则另一个转换成float。否则,先对操作数进行整型提升转换(integralpromotions),如果转换后操作数的类型不一样,则按e)以后的规则再进行转换。如果其中一个操作数类型为unsignedlongint,则另一个转换成unsignedlongint。否则,如果一个操作数类型为longint,另一个操作数类型为unsignedint,那么,如果longint能表示unsignedint的所有值,则unsignedint转换成longint,否则,两个操作数都转化成unsignedlongint。否则,如果一个操作数类型为longint,则另一个操作数转换成longint。否则,如果一个操作数类型为unsignedint,则另一个操作数转换成unsignedint。整型提升转换

(integralpromotions)对于char、signedchar、unsignedchar、shortint、unsignedshortint类型,如果int型能够表示它们的值,则这些类型转换成int,否则,这些类型转换成unsignedint。bool型转换成int型,false为0;true为1。wchar_t和枚举类型转换成下列类型中第一个能表示其所有值的类型:int、unsignedint、longint、unsignedlongint。对于关系操作,当操作数是算术类型和枚举类型时,编译程序将按常规算术转换规则对它们进行转换。对于逻辑操作,当操作数是算术型、枚举类型和指针类型数据进行操作,在操作前需进行逻辑类型转换:对于算术型和枚举类型,零转成false,非零转成true;对于指针类型,空指针转成false,非空指针转成true。对于逻辑位操作,编译程序将会按常规算术转换规则对操作数进行类型转换,运算结果的类型与转换后的操作数类型相同。对于移位操作,编译程序会对操作数按整型提升规则进行类型转换,运算结果的类型与第一个操作数类型(进行类型转换之后)相同。对于赋值操作,当赋值操作的两个操作数类型不同时,将按赋值转换规则进行隐式类型转换,即,把右边操作数转换成左边的操作数类型。对于条件操作符:第一个操作数也可以是算术型、枚举类型以及指针类型,编译程序将对其进行逻辑转换:0转成false;非0转成true。第二、三个操作数可以是任意类型,当它们的类型不同时,编译程序将对它们进行类型转换,其中,对于算术类型和枚举类型,编译程序将按常规算术转换规则进行转换。条件操作的结果类型为转换之后的第二、三个操作数类型。隐式转换的问题导致应该不合法的变成合法了!if(x=1)...//假设x的值为0if(a==b==c)...//假设a=5,b=5,c=5if(a<b<c)...//假设a=1,b=3,c=2在写下面的操作符时一定要小心,不要写错了,编译程序往往发现不了这类错误!==与=&&与&||与|<<与<>>与>隐式转换的问题(续)隐式转换有时不能满足要求。例如:

inti=-10; unsignedintj=3; i+j将得到错误的结果:4294967289再例如:(溢出)

inti=2147483647;//int类型中最大的正整数

intj=10; i+j将得到错误的结果:-2147483639显式转换(强制类型转换)显式转换是指在程序中用类型转换操作符显式地指出转换,显式转换又称强制类型转换。其格式为:

<类型名>(<操作数>)或

(<类型名>)<操作数>例如:

inti=-10; unsignedintj=3; i+(int)j将得到正确的结果:-7再例如:

inti=2147483647;//int类型中最大的正整数

intj=10; (double)i+j将得到正确的结果:2147483657.0表达式中的类型转换编译程序常常要对表达式中的操作数进行隐式类型转换,转换过程是逐个操作符进行类型转换。例如:shortinta=2;intb=2147483647;//int类型中最大的正整数doublec=2.0;表达式:a*b/c将得到错误的结果:-1.0。解决办法:

(double)a*b/c或

a*(double)b/c结果为:2147483647.0一些实数在计算机内部表示的是其近似值,用关系操作符直接对浮点数进行比较,有时会得出错误的结果:doubled1=0.1,d2=0.2,d=d1+d2;d==0.3//?......doublex,y;......y-x*(y/x)==0.0//?应避免对两个实数进行“==”和“!=”比较运算,应该通过计算它们的差的绝对值是否小于或大于某个很小的数来实现:x==y 可写成:fabs(x-y)<1e-6x!=y 可写成:fabs(x-y)>1e-6实数的“等于”与“不等于”比较短路求值(short-circuitevaluation)在C++中,对于逻辑“与”操作符“&&”逻辑“或”操作符“||”如果第一个操作数已能确定运算结果了,则不再计算第二个操作数的值,该规则称为短路求值。例如:false&&x的结果为falsetrue||x的结果为true短路求值一方面能够提高逻辑运算的效率,另一方面它也能为逻辑运算式中的其它运算提供一个“卫士”(guard)。例如:

(number!=0)&&(1/number>0.5)操作符的副作用通常情况下,操作符所指定的运算不会改变操作数的值(运算结果将保存在临时的存储单元中)。例如:x+y不会改变x和y的值,计算结果保存在一个临时的内存单元或寄存器中。 在C++语言中,有些操作符(如:赋值=、自增++、自减--等操作符)的运算在得到一个运算结果的同时,也会改变操作数的值,称这些操作符带有副作用。有副作用的操作有时会产生不良结果!带副作用操作符的表达式计算对不相邻的操作符,C++一般没有规定计算次序(&&、||、?:和,操作符除外)。例如,对于(a+b)*(c-d),C++没有规定+和-的计算次序。当一个表达式中包含带副作用的操作符时,该表达式的结果是不确定的。例如:

(x+1)*(++x)由于C++没有规定操作符+和++谁先计算,因此,不同的编译程序可能会给出不同的实现:(假设x初值为1)先计算+,则结果为:4

先计算++,则结果为:6 应尽量避免把带副作用的操作符用在复杂的表达式中,最好把它们作为单独的操作来用。左值表达式和右值表达式能出现在赋值操作符左边的表达式为左值表达式,否则是右值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论