




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章 表达式和语句,表达式是用于表达一个计算过程的操作符、操作数序列。 表达式根据某些约定、结合性和优先级、求值次序等规则来进行运算。 表达式和语句的区别是:表达式具有一个值,而语句没有值。,表达式的左值和右值 左值(lvalue):出现在赋值表达式左边的表达式。 右值 (rvalue):出现在赋值表达式右边的表达式。,算符的优先级与结合性,操作符优先级决定了在复杂表达式中各操作符执行的先后顺序。 C+中规定了各种运算符的结合方向(结合性),算术运算符的结合性为左结合性,而赋值、增量、减量等运算符为右结合性。, 算术类型转换,有关类型的信息只是一种规则:“取x位二进制数并按下面的规定翻译它们
2、”。 某些类型转换是不安全的,如将占存储空间大的类型转换为占存储空间小的类型是一类不安全的转换。 long lval; unsigned char uc; int (3.14159); (signed char) uc; short (lval);,隐式类型转换 是由编译器完成的没有程序员人为干预的类型转换,它在不同类型的数据参与同一运算时自动完成。 把一个数值赋给一个对象时,系统将该数值的类型转换为对象所具有的类型;把一个数值传给一个函数时,系统将其类型转换为参数所具有的类型。,如: void fun(int); int val=3.14159; fun(3.14159);,在算术表达式中,
3、具有较大空间的数据类型成为最终结果转换成的数据类型。,例1: int val = 3; val + 3.1415914; val = val +3.1415914; /进行了两次类型转换 例2: int i=10; i * =2.3; 例3: long m = 234*456/6; 例4: float f=3.5; long int n=6; long k=21; double ss=f*n+k/2;,显式类型转换 形式:type (expr) (type) expr 原因: 使基本转换不再进行 例如: int i; i = i + 3.1415914; i = i + int (3.1415
4、914); 在有可能存在几种隐式类型转换的情况下,明确地指出使用哪一种类型转换。 在引用void *型指针之前,必须先进行显式类型转换。,例如: int i; void *vp; int *ip= / error,dp = (double *)vp;, 赋值运算符,赋值构成一个表达式,它具有值。 如: cout (x = 10) ; 赋值运算可将多个操作数连起来,但应该保证各操作数的类型是一致的。 如:int a; float b; a=b=0; / Warning 进行赋值运算时,可能由于右值超出左值的范围而发生溢出现象。 如:short int x = 52367;,算术运算符,(1)“/
5、”运算符的两个运算对象均为整数时,其结果是整数。(2)取模运算符“%” 要求参加运算的两个数均为整数。(3)遵循算术的自然特性,例如禁止除数为0等;(4)防止数据长度的溢出。,算术运算问题 2-2,整型数的周而复始性,如: unsigned int a = 2000000000; unsigned int b = 3000000000; cout a+b“n”; 结果为: 705032704 =5000000000%232 超过表示范围的整型数不是报错,而是表示成一个去掉进位后的余数,有符号数 int a =2000000000; int b =1000000000; A+b=30000000
6、00取补 /3000000000-232*n = -1294067296,中间结果溢出,中间结果溢出导致计算错误,如: int a = 100000; int b = 100000; int c = 1000; couta*b/cn; couta*(b/c)n; 结果为: 1410065 10000000,关系运算符,逻辑运算符,赋值运算符, 增量与减量运算,形式: +i, -i, i+, i- 注意: +与-运算只能用于变量,而不能用于常量和表达式。 如:int i=3; cout - i +; 前增量(减量)表达式返回的是左值。 如: +(+a); (a+)+; /error +(a+);
7、 /error,增量操作 3-1,前增量与后增量: 操作数为左值才能做增量操作 const int d = 8 ; d+ ; / 错: d不是左值 3+ ; / 错: 3不是左值 int a = 3, x = 3, b, c ; b = +a ; / a的前增量操作,使b 为4 c = x+ ; / x的后增量操作,使c 为 5 a+ -= 2 ; / 错: a+不是左值 +a += 5; / ok: +a 是左值且a最后为11 +a+; / 错: 先做a+,而a+不是左值,增量操作 3-2,编译的贪吃特征: int a = 3, b = 5, c; c = a + b ; /错: 理解为a+
8、 b c = a + b; /ok: a+ +b c = a + b; /错: 理解为a+ +b c = a + b; /错: 理解为a+ + +b,在表达式中使用+或-易引发一些问题。 不同的编译器求值顺序不同 例1:int a=3,b=5,c; c=a*b + +b; 例2:int i=3; (+i) + (+i) + (+i); 求值顺序使交换律失去作用 例3:c=a*b + +b; 与 c= +b + a*b; 求值顺序使括号失去作用 例4:int a=3,b=5,c; c=+b * (a+b);, 逗号表达式,语法形式: 表达式1,表达式2, 表达式n 如:a =3, b =a+1,
9、 c = b+1; 逗号表达式是有值的,值为表达式n的值。 如:x = (a = 3 , 6*3); C+中,如果逗号表达式的最后一个表达式为左值,则该逗号表达式可为左值。 如 (a =3, b =a+1, c ) = 5 ; 使用逗号表达式的主要目的是为了分别求得各个表达式的值。, 条件运算符,语法形式: (表达式1)?(表达式2):(表达式2) 条件运算符的结合方向为“自右向左”。 如 a b ? a : c d ? c : d a b ? a : (c d ? c : d) 条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同,表达式2与表达式3的类型也可以不同。 如: int
10、 x=3,y=2; x y ?1:2.55 ;,sizeof运算符,sizeof运算符用于返回变量或数据类型所占用的存储空间的字节长度,格式由3种:“sizeof (数据类型)”、“sizeof(变量)”和“sizeof 变量”。例如在32位机器中,sizeof (double)的值为 8。,位运算符,C+语言有两种方式支持位向量操作: (1)用整数表示位向量,通过位运算符测试或者设置其中的一位或一组二进制数。整数可以是unsigned,也可以是signed,建议采用unsigned型的整数,因为符号位在不同的位运算符中的处理方法是不一样的,并且依赖于具体的机器型号。 (2)是采用标准库提供的
11、bits类。,位运算符,位操作 4-1,左移操作 将整数最高位挤掉,在右端补0。如: int a = 12; / a为:00000000000000000000000000001100 a = a1; / a为:00000000000000000000000000011000,位操作 4-2,右移操作 在整数的高位挤一个0或1进去(有符号数挤符号位,无符号数挤 ),而整数最低位被挤掉。如: short int a = -2; / 1111111111111110 a = a1; / a=-1 即1111111111111111 unsigned short int b = 65535; / 1
12、111111111111111 b = b1; / b=32767即0111111111111111 C+对右移操作规定:对有符号数,若最高位是1,则高位挤进1 若最高位是0,则高位挤进0,对无符号数,则一律挤进0,位操作 4-3,位与操作 结果为:( 比较 / a为: 00000000000000000000000000001100 int b = 6; / b为: 00000000000000000000000000000110 / a | b为: 00000000000000000000000000001110 int cbit = a | b; int clogic = a | b;
13、cout cbit “n” clogic “n” ; 结果为:( 比较 | 与 | 的区别 ) 14 1,位异或操作 将两个操作数每一位做异或操作,如: int a = 12;/ a为: 00000000000000000000000000001100 int b = 6; / b为: 00000000000000000000000000000110 a=a b 为: 00000000000000000000000000001010 a=10,运算符的优先级和结合律,在C+的表达式中,优先级高的运算符先算,低的后算,相同级别的运算符则由结合律来决定。 运算符的结合律有两种:从左到右和从右到左。
14、,操作符说明,第1级:双冒号: ,它规定了名字空间域。 第2级:数组下标,函数调用,输出精度控制 第3级:static、dynamic、reinterpret、const . 注:这部分内容只要简单了解就可以,不必死记。,优先级和结合性,表达式副作用 4-1,表达式的值 由操作数和操作符决定. 操作符决定对操作数施加的操作 操作的先后由优先级和结合性作主 访问操作数的先后,语言没有明确规定 表达式的副作用 表达式的值因为访问操作数先后顺序不同而不同所引起,表达式副作用 4-2,使结合律失效 int a = 3, b = 5 ; c = a*b + +b; d = +b + a*b; / c与d
15、不同 /c为21,d 为24 或反之使括号失效 int a = 3 , b = 5 ; int c = +b * ( a+b ) ; /可能为54,表达式副作用 4-3,副作用的根源 表达式中,多于一个的实体值发生改变 int a = 3, b = 5 ; c = a*b + +b ; / c和b改变 此时,若其中一个实体被访问两次以上,则副作用可能发生 a = ( b=25 ) += 5 ; / a和b改变,但都被访问1次 a = ( b=25 ) + b ; / 副作用: a,b改变,b被访问2次,表达式副作用 4-4,消除副作用分开语句写,如: c = a*b + +b ; 可以写成:
16、c = b + a*b ; b+ ; 或者 b+ ; c = b + a*b ;,条件语句 2-1,if与switch语句合称为分支语句。 if语句的两种形态 if (条件) 语句 if (条件) 语句1 else 语句2,if(ab) coutaendl; if(a=b) coutaendl; else coutbendl;,条件语句 2-2,语句1,条件,语句1,条件,语句2,是,是,否,否,if语句的几个要点 4-1,有些if语句,根据上下文,else可以省略,另外要注意if语句写法的多样性。,例如: int max(int a, int b) if(ab) return a; else
17、 return b; /return是返回值的意思 或 int max(int a, int b) if(ab) return a; return b; ,if语句的几个要点 4-2,if条件后的语句不止一条,则要用大括号包成复合语句。,例如: if (ab) /if条件后面的语句不止一条 a=a+s; couts; else b = b+s;,if语句的几个要点 4-3,if(条件)中的条件有多种写法。在C/C+语言中,0表示假,非0表示真。,例如: if (s) cout“this is sn”; /若s为0则跳过,否则输出this is s if(int a=b) countaendl;
18、 /用b赋给定义的a变量 if(x) 等价于 if(x=0) if(!x)等价于 if(x!=0) / !x中的惊叹号表示“反”, != 表示不等于,if语句的几个要点 4-4,条件语句可以嵌套,但要防止模凌两可,一般建议用大括号明确分开,以增加程序的可阅读性。,例如: if (x0) if(x50) cout “OK.n”; else count “Not OK.n”,条件表达式,条件表达式简化if语句写法 条件表达的语法: (条件)?表达式1:表达式 条件表达式是C+中唯一的一个三元操作符 由于条件操作符的优先级较低,所以整个条件表达式一般总要带上括号。,if语句与条件表达式互换,对于 i
19、f(x) a = 327981; else b = 327981; 可表示为: x ? a=327981 : b=327981; 如果a和b为同类型,则还可以: (x?a:b) = 327981;,浮点数的比较,浮点数的精度和有效位 影响比较的正确性,如: float f1 = 7.123456789; float f2 = 7.123456785; if ( f1=f2 ) cout“f1 equal to f2n”; float f = 1.0/3.0; double d = 1.0/3.0; if ( g=d ) cout“g not equal to dn”; 结果为: f1 equa
20、ls to f2 g not equals to d,浮点数的比较,浮点数计算的近似性 使精确性比较失败,如: double d1 = 123456789.9*9; double d2 = 1111111109.1; if ( d1!=d2 ) cout “Not samen” ; else cout “Samen” ; if ( abs ( d1-d2 ) 1e-05 ) cout “Samen” ; else cout “Not samen” ; 结果为: Not same Same,switch语句 2-1,switch语句一般用于2个以上的分支 switch语句的一般形式:,switc
21、h () case : case : : : case : default: ,等价于: if(表达式=value1) 语句1; else if(表达式=value2) 语句2; else 语句n; ,switch语句 2-2,虽然switch有等价的复合if表示, 而且,分支判断值只能是整数,显得应用范围狭窄, 但是switch在使用上的直观和灵活形式, 使得其仍具有编程价值. 如: break可选,甚至case可以重叠: case value1: 语句1; case value2: 语句2; case v1: case v2: case v3: 语句;,switch 语句要点 8-1,sw
22、itch ()中的表达式只能是整形、字符型或枚举型表达式。关于数据类型将在下一章讲解。,float f = 4.0; switch(f) /错 . ,switch 语句要点 8-2,default语句 当表达式的值与某个case后面的常量表达式值相等时,就执行此case后面的语句;若所有case中的常量表达式都不匹配式,就执行default语句。,switch 语句要点 8-3,case 值 case后面的值是不能重复的,否则会出现编译错误。 case 后面的值在实际中通常会用常量名称或宏替代,以增加程序的可阅读性 。,case A: cout “this is An”; case 65:co
23、ut “this is 65n”; /错:A等于ASCII码的65,switch 语句要点 8-4,遇break跳出 Case与default只起语句标号的作用,并不改变程序流程,如果要改变流程通常case要与break语句联用。,swicth(grade) case A: cout “90100n”; case B: cout “8089n”; case C: cout “7079n”; case D: cout “6069n”; case E: cout “60n”; default: cout “errorn”; ,swicth(grade) case A: cout “90100n”;
24、 break; case B: cout “8089n”; break; case C: cout “7079n”; break; case D: cout “6069n”; break; case E: cout “60n”; break; default: cout “errorn”; ,switch 语句要点 8-5,case 顺序随意 (不提倡) 各个case(包括default)的出现次序可以任意,在每个case分支都带有break的情况下,case次序不影响执行结果。,swicth(grade) case A: cout “90100n”; break; case D: cout “6069n”; break; case B: cout “8089n”; break; case C: cout “7079n”; break; default: cout “errorn”; case E: cout “60n”; break; ,switch 语句要点 8-6,break使用技巧 可以选择使用break,也可以多个case语句并列,丰富switch的用法。,swi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 20251房地产项目环境影响专项评价(评估)合同
- 公司买卖电脑合同标准文本
- 物业出租安全管理合同二零二五年
- epc附加合同样本
- 二零二五夫妻婚前购房协议
- 借款押车的合同
- 2025年OLED检测系统合作协议书
- 土地使用权转让合同书范例
- 二零二五委托投资协议合同
- 2025年太阳能用石英玻璃材料合作协议书
- 2024年事业单位考试贵州省毕节地区毕节市A类《职业能力倾向测验》统考试题含解析
- (完整文本版)新概念英语第一册单词表默写版1-144
- 《我的心灵疗愈》
- 中国教育史(第四版)全套教学课件
- 2022年4月自考02400建筑施工(一)试题及答案含评分标准
- 志愿者申请登记表
- 第七讲-信息技术与大数据伦理问题-副本
- 债权转让执行异议申请书范本
- (完整版)数字信号处理教案(东南大学)
- 向政府申请项目资金申请报告
- 旅游心理学个性与旅游行为课件
评论
0/150
提交评论