《第4章计算表达精选文档.ppt》由会员分享,可在线阅读,更多相关《第4章计算表达精选文档.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章计算表达本讲稿第一页,共三十页2023/4/11长春理工大学2局部域n局部域是包含在函数定义(或函数块)中的程序文本区n每一个函数都有一个独立的局部域n在函数中,每个复合语句(或块)也有它自己的局部域n局部域可以被嵌套n局部域的名字解析q首先查找使用该名字的域,如果找到一个声明,则该名字被解析q如果没找到,则查找包含该域的域q这个过程会一直继续下去,直到找到一个声明或已经查找完整个全局域q如果都没有找到,即没有找到该名字的声明,则这个名字的用法将被标记为错误本讲稿第二页,共三十页面向对象程序设计计算表达长春理工大学董元方本讲稿第三页,共三十页2023/4/11长春理工大学4计算表达n名词
2、解释与操作符n算术运算问题n相容类型的转换n关系与逻辑操作n位操作n增量操作n表达式的副作用本讲稿第四页,共三十页2023/4/11长春理工大学5名词解释1n操作符q表示动作或动作序列的符号,动作有的是表达式计算、有的是声明和定义n实体q指一定大小的内存空间,它具有类型q与实体相关联的名字称为变量、常量、对象、函数、指针等n常量q与变量相对应,是关联于实体的名字,通过它只能对实体进行读访问n表达式q是一些操作符、操作数按规则排列的序列q目的是用来描述一个计算n赋值表达式q=、*=、/=、%=、+=、-=、=、&=、|=、=double d=5/2;double e=3*d+(+d);e=3+5
3、*6;d=e=5;本讲稿第五页,共三十页2023/4/11长春理工大学6名词解释2n条件表达式q用在if/for/while/条件操作符(?:)后面描述条件的部分q只要具有值的表达式都可以作条件表达式q结果只有两种:1和0n逗号表达式q若干个表达式以逗号操作符隔开q逗号表达式的求值过程是从左边第一项开始,逐项进行的,其值为最后一个子表达式的值n左值和右值q是相对赋值表达式而言的q左值是能出现在赋值表达式左边的表达式,有空间实体和读写访问权q右值是可以出现在赋值表达式右边的表达式,可以是不占据内存空间的临时量和字面值,可以是不具有写入权的空间实体本讲稿第六页,共三十页2023/4/11长春理工大
4、学7操作符的优先级和结合性优先级操作符结合性1:左右2.-()左右3+-!-+&*()sizeof new delete castname_cast 单目操作符单目操作符右左4.*-*左右5*/%左右6+-左右7左右8 =左右9=!=左右本讲稿第七页,共三十页2023/4/11长春理工大学810&左右11左右12|左右13&左右14|左右15?:右左16=*=/=%=+=-=&=|=右左17throw左右18,左右本讲稿第八页,共三十页2023/4/11长春理工大学9算术运算问题n周而复始的整数q例:一种8位整数类型的表示范围在-128127之间,而用它定义的变量a超出了表示范围q无符号数和有
5、符号数在计算时都是以256为模的,只不过在显示结果时,对于最高位非0的有符号数要显示一个负号,然后对该数取补n算法局限性q算法总是描述一般的方法,而编程总是考虑语言描述的局限性n中间结果溢出q例:inta=100000,b=100000,c=1000;couta*b/c;n浮点数的比较q使用浮点数进行相等和不相等比较的操作通常是有问题的。浮点数的相等比较,一般总是使用两者相减的值是否落在0的邻域中来判断的本讲稿第九页,共三十页2023/4/11长春理工大学10相容类型的转换charshortintlong intlong doubledoubleunsigned charunsigned sh
6、ortunsigned intunsigned longfloat隐隐式式转转换换本讲稿第十页,共三十页2023/4/11长春理工大学11类型转换需注意n精度丢失:从高精度向低精度转换的时候,可能会引起精度丢失n显式转换:为了控制计算过程,使得类型转换不按机器隐式类型转换的那样进行,则可以通过显式转换qstatic_cast:对被转换的表达式进行type类型的再求值qreinterpret_cast:什么都不做,只是强制逃避编译的类型检查而已,一般用来转换不同类型的指针。对于需要求值计算的表达式它会拒绝转换本讲稿第十一页,共三十页2023/4/11长春理工大学12精度丢失实例#includeu
7、singnamespacestd;voidmain()floatf=7.0/3;inta=7.0/3;cout.precision(9);coutfixed7.0/3endlfendlaendl;doubled=123456789.9*9;a=f=d;coutdendlfendlaendl;本讲稿第十二页,共三十页2023/4/11长春理工大学13显式转换实例#include#includeusing namespace std;void main()double d=sqrt(123456.0);int a=static_cast(d)*8+5;int b=d*8+5;coutdendlae
8、ndlbendl;a=2000000000;b=1000000000;int c=(static_cast(a)+b)/2;couta+bendlc大于比较q=大于等于比较q=小于等于比较q!=不等于比较关系操作的结果就是关系操作的结果就是truetrue和和falsefalse两个逻辑值之一。两个逻辑值之一。逻辑值可以进行逻辑运算逻辑值可以进行逻辑运算(操作)(操作)本讲稿第十四页,共三十页2023/4/11长春理工大学15逻辑操作n逻辑操作符q!非操作q&逻辑与q|逻辑或aba&ba|b0000010110011111a!a0110本讲稿第十五页,共三十页2023/4/11长春理工大学16
9、逻辑表达n某任务需要在A、B、C、D、E这五人中物色人员去完成,但派人受限于下列条件:q若A去,则B跟去qD,E两人中必有人去qB,C两人中必有人去,但只去一人qC,D两人要么都去,要么都不去q若E去,则A,B都去AB !A|BD|E(B&!C)|(!B&C)(C&D)|(!C&!D)E(A&B)!E|(A&B)本讲稿第十六页,共三十页2023/4/11长春理工大学17AB !A|BD|E(B&!C)|(!B&C)B!=C(C&D)|(!C&!D)C=DE(A&B)!E|(A&B)A&!B!(D|E)B=CC!=DE&!(A&B)求反求反本讲稿第十七页,共三十页2023/4/11长春理工大学1
10、8位操作1n右移操作q在整数的高位挤一个0或1进去,而整数右边的1或0被挤掉q对有符号数,若最高位是1,则高位挤进1;最高位是0则挤进0;对无符号数,则一律高位挤进0short int a=12;/a为为:0000000000001100a=a1;/a为为:0000000000011000short int a=-2;/a为为:1111111111111110a=a1;/a为为:1111111111111111本讲稿第十八页,共三十页2023/4/11长春理工大学19n&位与操作q将两个操作数每一位做与操作n|位或操作q将两个操作数每一位做或操作n位异或操作q将两个操作数每一位做异或操作n位反
11、操作q将一个操作数每一位取反short int a=12;/a为为:0000000000001100short int b=6;/b为为:0000000000000110a=a&b;/a为为:0000000000000100short int a=12;/a为为:0000000000001100short int b=6;/b为为:0000000000000110a=a b;/a为为:0000000000001110short int a=12;/a为为:0000000000001100short int b=6;/b为为:0000000000000110a=a b;/a为为:00000000
12、00001010short int a=12;/a为为:0000000000001100a=a;/a为为:1111111111110011本讲稿第十九页,共三十页2023/4/11长春理工大学20n将每个人的去与不去看成是5位整数的其中1位,其中A对应最高位,E对应最低位,那么,所有可能的调派方案为从全部不派的00000到全部派去的11111之间变化。显然共有32种方案。全部遍历的循环为:for(inti=0;i32;+i)n其中每个i对应一个二进制数,为一种调派方案。n把这五个条件表示成否定的形式:q否定条件1为:!(!A|B)=A&!Bq否定条件2为:!(D|E)q否定条件3为:B=Cq否
13、定条件4为:C!=Dq否定条件5为:E&!(A&B)本讲稿第二十页,共三十页2023/4/11长春理工大学21#includeusing namespace std;void print(int I);void main()for(int I=0;I32;+I)bool A=I&16,B=I&8,C=I&4,D=I&2,E=I&1;if(A&!B)continue;if(!D&!E)continue;if(B=C)continue;if(C!=D)continue;if(E&!(A&B)continue;print(I);void print(int I)cout(I&16?A:A)(I&8?
14、B:B)(I&4?C:C)(I&2?D:D)(I&16?E:E)endl;本讲稿第二十一页,共三十页2023/4/11长春理工大学22增量操作+n前增量:先将变量增1,使其实体发生变化,然后将变量对应的实体作为表达式结果n后增量:先将变量的值(仅仅是值,不是实体)作为表达式的值确定下来,再将变量增1,实体值发生变化3+1a+a左值表达式结果为43+1aa+右值表达式结果为3本讲稿第二十二页,共三十页2023/4/11长春理工大学23#includeusingnamespacestd;voidmain()inta=3;intb=4+(+a);coutaendlbendl;#includeusin
15、gnamespacestd;voidmain()inta=3;intb=4+(a+);coutaendlbendl;本讲稿第二十三页,共三十页2023/4/11长春理工大学24表达式的副作用n操作数求值顺序n编译器相关n交换律失效n括号失效模块模块A模块模块B模块模块C操作数顺序:先A次B后C?先B次C后A?先C次B后A?操作符顺序:先后,雷打不动本讲稿第二十四页,共三十页2023/4/11长春理工大学25消除表达式的副作用n如果一个表达式,有多于一个的实体值发生改变的情况,那么就要警惕,看实体值是否在表达式中被再次访问,如果有,则该表达式的求值正确性就没有办法保证n表达式副作用的根本原因是:
16、充当操作数的模块可能会影响同一个表达式的另一个操作数模块的计算值n解决方法:分解表达式语句本讲稿第二十五页,共三十页2023/4/11长春理工大学26清凉世界本讲稿第二十六页,共三十页2023/4/11长春理工大学27本讲稿第二十七页,共三十页2023/4/11长春理工大学28本讲稿第二十八页,共三十页2023/4/11长春理工大学29本讲稿第二十九页,共三十页2023/4/11长春理工大学30StdAfx.hn是MicrosoftVisualStudio为了加快编译速度而设置的预编译头文件。n所谓头文件预编译,就是把一个工程中使用的一些MFC标准头文件预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。n预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。n编译器认为,所有在指令#include“stdafx.h”前的代码都是预编译的,它跳过#include“stdafx.h”指令,使用projectname.pch编译这条指令之后的所有代码nafx_泛指MFC中的全局变量和全局函数af就是applicationframework,x添进去为了凑出三个字母吧本讲稿第三十页,共三十页