C++程序设计教程4_第1页
C++程序设计教程4_第2页
C++程序设计教程4_第3页
C++程序设计教程4_第4页
C++程序设计教程4_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

06:50:411C++程序设计教程(第二版)第四章计算表达Chapter4

ComputationalExpressing清华大学出版社钱能06:50:412计算表达:表达计算使用一系列操作,它依赖于特定语言的操作符功能,关乎数据类型的内在特性,故计算表达目的在于深入剖析数据类型对于编程的影响,从而准确使用操作符学习方法:1.掌握操作符的功能和相互关系〔优先级和结合性〕2.针对内部数据类型,对一些典型的操作中的典型问题留下深刻印象06:50:413第四章内容

名词解释(NameExplainations)

算术运算问题(ArithmeticProblems)

相容类型的转换(CastCampatibleType)

关系与逻辑操作(Relation&LogicOperations)

位操作(BitOperations)

增量操作(IncrementOperations)

表达式副作用(Expression’sSideEffects)

06:50:4141.操作符(Operators)单目操作符:在一个操作数上施加的操作,如:-3双目操作符:在二个操作数上施加的操作,如:5-3故有些操作符既是单目操作符,又是双目操作符表达式:假设干个操作数和操作符按语法规那么构成的操作,如:a=-3-5+6*7/-8逗号表达式值为最后一个子表达式的值,但求值过程是从左至右逐项进行的。例如:D=(a=2,b=a+5,a*b);//d的值为1406:50:415左值和右值左值和右值是相对于赋值表达式而言的。左值表达式不但具有空间实体,还具有读写访问权。右值可以是不占据内存空间的临时量或字面值,可以是不具有写入权的空间实体。06:50:416例如:Constintb=5;A=b+2;B=a+2;//错:b拥有空间但无写入权(a=4)+=28;//(a=4)为左值06:50:41706:50:418优先级:表达式中多个操作符的执行顺序的规定性,如:

*x++;

//先做x++

结合性:同级操作符的执行顺序的规定性,如:

a=b=6;//先做b=606:50:4192.算术运算问题(ArithmeticProblems)整型数表示范围有限,如:

1+2+3+...+10000不能用整型变量累计的一般循环方法来解:intsum=0;for(inti=1;i<=10000;++i)sum+=i;cout<<sum<<“\n”;06:50:4110整型数的周而复始性,如:

unsignedinta=2000000000;unsignedintb=3000000000;cout<<a+b<<“\n”;

结果为:705032704//取模232而得

超过表示范围的整型数不是报错,而是表示成一个去掉进位后的余数06:50:4111中间结果溢出导致计算错误,如:

inta=100000;

intb=100000;

intc=1000;cout<<a*b/c<<"\n";cout<<a*(b/c)<<"\n";

结果为:

14100651000000006:50:4112浮点数的精度和有效位影响比较的正确性,如:

floatf1=7.123456789;floatf2=7.123456785;cout<<(f1!=f2?“notsame\n”:“same\n”);floatg=1.0/3.0;doubled=1.0/3.0;cout<<(g==d?“same\n”:“same\n”);结果为:samenotsame06:50:4113浮点数计算的近似性使精确性比较失败,如:

doubled1=123456789.9*9;doubled2=1111111109.1;if(d1!=d2)cout<<“Notsame\n”;elsecout<<“Same\n”;if(abs(d1-d2)<1e-05)cout<<“Same\n”;elsecout<<“Notsame\n”;结果为:NotsameSame结论:使用浮点数进行相等和不想等比较的操作通常是有问题的。浮点数的相等比较,一般总是使用两者相减的值是否落在0的临域中来判断的。----即小于10的负几次方。06:50:411406:50:41153.相容类型转换(CastCompatibleType

)

隐式转换:整型和浮点型都是数值型,所以它们是相容类型.指针与整型不相容,如:

7.0/3=7.0/3.0//将3隐式转换成浮点

=2.33333333…inta=‘a’+3;inta=9;int*ap=&a;3+ap//错06:50:4116从表达能力弱的类型到强的类型的转换是平安的,反之,会引起精度丧失.如:floatf=7.0/3;//doublefloatinta=7.0/3;//doubleintcout.precision(9);cout<<fixed<<7.0/3<<“\n”;cout<<f<<“\n”<<a<<“\n”;结果为:2.3333333332.333333254206:50:4117可以用显式转换的方法,人为控制运算在一定的数据类型下工作,如:

doubled=sqrt(123456.0);inta=static_cast<int>(d)*8+5;intb=d*8+5;//隐式转换为浮点cout<<a<<“\n”<<b<<“\n”;A=2000000000;B=1000000000;intc=(static_cast<double>(a)+b)/2;Cout<<a+b<<endl<<c<<endl;结果为:28132815-12949672961500000000static_cast<type>显式转换采用显式转换的第一个目的是为了维护整型数运算的一致性。另一个目的是为了得到正确的计算结果。06:50:411806:50:41194.关系与逻辑操作(Relations&LogicOperations

)=与==的区别intx=9;X=(x==9);//因为相等,值为1赋值给x,赋值表达式的值为1x=9;//赋值表达式的值为9X=(x==0);//因为不相等,值为0赋给x,赋值表达式的值为0注:赋值表达式也具有值,它的值就是所赋的值。逻辑表达式的值为0或1.06:50:41204.关系与逻辑操作(Relations&LogicOperations

)=与==的区别intx=9;if(x==0)cout<<“test1ok\n”;if(x=5)cout<<“test2ok\n”;if(x=0)cout<<“test3ok\n”;结果为:test2ok注:赋值表达式也具有值,它的值就是锁赋的值。逻辑表达式的值为0或1.06:50:4121!=是操作符,=!不是操作符

intx=3;if(x!=9)cout<<“not9\n”;if(x=!9)cout<<“xisfalse\n”;条件表达式(x!=0)与(x)等同

intx=3;if(x!=0)cout<<x;if(x)cout<<x;06:50:4122不等式连写的错误:

inta=-1,b=0,c=1;if(a<b<c)cout<<“ok1\n”;if(a<b&&b<c)cout<<“ok2\n”;结果为:

ok2

06:50:4123短路求值的妙用:1、防止除0的恶果if(b&&a/b>2)cout<<“ok\n”;2、防止不必要的求值if(a==0||b=func())cout<<”useless\n”;06:50:41245.位操作(BitOperations)

左移操作<<将整数最高位挤掉,在右端补0。如:

inta=12;//a为:00000000000000000000000000001100a=a<<1;//a为:0000000000000000000000000001100006:50:4125右移操作>>在整数的高位挤一个0或1进去〔有符号数挤符号位,无符号数挤0〕,而整数最低位被挤掉。如:

shortinta=a>>1;//a=-1即unsignedshortintb=b>>1;//b=32767即06:50:4126位与操作&将两个操作数每一位做与操作,如:inta=12;//a为:00000000000000000000000000001100intb=6;//b为:00000000000000000000000000000110//a&b为:00000000000000000000000000000100intcbit=a&b;intclogic=a&&b;cout<<cbit<<“\n”<<clogic<<“\n”;结果为:(比较&与&&的区别)4106:50:4127位或操作|将两个操作数每一位做或操作,如:inta=12;//a为:00000000000000000000000000001100intb=6;//b为:00000000000000000000000000000110//a|b为:00000000000000000000000000001110

intcbit=a|b;intclogic=a||b;cout<<cbit<<“\n”<<clogic<<“\n”;结果为:(比较|与||的区别)14106:50:41286.增量操作(IncrementOperations)

前增量与后增量:前增量可以当左值。

constintd=8;d++;//错:d不是左值

3++;//错:3不是左值

inta=3,x=3,b,c;

b=++a;//a的前增量操作,使b为4c=x++;//x的后增量操作,使c为3a++-=2;//错:a++不是左值

++a+=5;//ok:++a是左值且a最后为9++a++;//错:先做a++,而a++不是左值06:50:4129编译的贪吃特征:

inta=3,b=5,c;c=a++b;//错:理解为a++bc=a+++b;//ok:a+++bc=a++++b;//错:理解为a++++bc=a+++++b;//错:理解为a+++++b06:50:4130指针的增量操作:chars1[10],s2[]=“hello”;char*p1=s1,*p2=s2;while(*p1++=*p2++);等价于以下操作序列:while(*p2){*p1=*p2;p1++;p2++;}*p1=0;12301661230082HelloHelp1p206:50:41317.表达式副作用(Expression’sSideEffects)

表达式的值

温馨提示

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

评论

0/150

提交评论