C++程序设计教程 第四章 计算表达

上传人:pu****.1 文档编号:570095481 上传时间:2024-08-01 格式:PPT 页数:28 大小:326.50KB
返回 下载 相关 举报
C++程序设计教程 第四章 计算表达_第1页
第1页 / 共28页
C++程序设计教程 第四章 计算表达_第2页
第2页 / 共28页
C++程序设计教程 第四章 计算表达_第3页
第3页 / 共28页
C++程序设计教程 第四章 计算表达_第4页
第4页 / 共28页
C++程序设计教程 第四章 计算表达_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《C++程序设计教程 第四章 计算表达》由会员分享,可在线阅读,更多相关《C++程序设计教程 第四章 计算表达(28页珍藏版)》请在金锄头文库上搜索。

1、23:15:061C + 程序设计教程(第二版)第四章 计算表达 Chapter 4 Computational Expressing23:15:062n计算表达: 表达计算使用一系列操作,它依赖于特定语言的操作符功能,关乎数据类型的内在特性,故计算表达目的在于深入剖析数据类型对于编程的影响,从而准确使用操作符n学习方法: 1.掌握操作符的功能和相互关系(优先级和结合性) 2.针对内部数据类型,对一些典型的操作中的典型问题留下深刻印象23:15:073第四章内容1. 名词解释名词解释( Name Explainations ) 2. 算术运算问题算术运算问题 ( Arithmetic Prob

2、lems ) 3. 相容类型的转换相容类型的转换 ( Cast Campatible Type ) 4. 关系与逻辑操作关系与逻辑操作 ( Relation & Logic Operations )5. 位操作位操作 ( Bit Operations ) 6. 增量操作增量操作 ( Increment Operations ) 7. 表达式副作用表达式副作用 ( Expressions Side Effects ) 23:15:0741. 操作符操作符 ( Operators )单目操作符:在一个操作数上施加的操作,如:-3双目操作符:在二个操作数上施加的操作,如:- 故有些操作符既是单目操作

3、符,又是双目操作符表达式:若干个操作数和操作符按语法规则构成的操作,如: a = -3-5+6*7/-823:15:075优先级:表达式中多个操作符的执行顺序的规定性,如: *x+; / 先做x+结合性:同级操作符的执行顺序的规定性,如: a=b=6; / 先做b=623:15:076. 算术运算问题算术运算问题( Arithmetic Problems )整型数表示范围有限,如: 不能用整型变量累计的一般循环方法来解: int sum = 0; for(int i=1; i=10000; +i) sum += i; coutsum“n”;23:15:077整型数的周而复始性,如: unsig

4、ned int a = 2000000000; unsigned int b = 3000000000; cout a+b“n”; 结果为: 705032704 超过表示范围的整型数不是报错,而是表示成一个去掉进位后的余数23:15:078中间结果溢出导致计算错误,如: int a = 100000; int b = 100000; int c = 1000; couta*b/cn; couta*(b/c)n; 结果为: 1410065 1000000023:15:079浮点数的精度和有效位 影响比较的正确性,如: float f1 = 7.123456789; float f2 = 7.12

5、3456785; 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 equals to f2 g not equals to d23:15:0710浮点数计算的近似性 使精确性比较失败,如: double d1 = 123456789.9*9; double d2 = 1111111109.1;if ( d1!=d2 ) cout “Not samen” ;else cout “Samen” ;if (

6、 abs ( d1-d2 ) 1e-05 ) cout “Samen” ;else cout “Not samen” ;结果为:结果为:Not sameSame23:15:07113. 相容类型转换相容类型转换 ( Cast Compatible Type ) 隐式转换:整型和浮点型都是数值型,所以它们是相容类型指针与整型不相容,如: 7.0 / 3 = 7.0 / 3.0 /将隐式转换成浮点 = 2.33333333 int a = 9; int* ap = &a; 3 + ap /错23:15:0712从表达能力弱的类型到强的类型的转换是安全的,反之,会引起精度丢失如: float f =

7、 7.0/3; / doublefloat int a = 7.0/3; / doubleint cout.precision(9); cout fixed 7.0/3 “n” ; cout f “n” a “n” ; 结果为:结果为: 2.333333333 2.333333254 223:15:0713可以用显式转换的方法,人为控制运算可以用显式转换的方法,人为控制运算在一定的数据类型下工作,如:在一定的数据类型下工作,如: double d = sqrt ( 123456.0 ) ;int a = static_cast(d) * 8 + 5;int b = d * 8 + 5; / 隐

8、式转换为浮点couta“n”b“n”;结果为:2813281523:15:07144. 关系与逻辑操作关系与逻辑操作 (Relations & Logic Operations )=与=的区别int x = 9;if ( x = 0 ) cout “test 1 okn” ;if ( x = 5 ) cout “test 2 okn” ;if ( x = 0 ) cout “test 3 okn” ;结果为:test 2 ok23:15:0715!=!=是操作符,是操作符,=!=!不是操作符不是操作符 int x = 3; if ( x!=9 ) cout “not 9n” ; if ( x=

9、!9 ) cout “impossiblen” ;条件表达式(x!=0)与(x)等同 int x = 3; if ( x != 0 ) cout x ; if ( x ) cout x ;23:15:0716不等式连写的错误: int a = -1, b = 0, c = 1; if ( abc ) cout “ok1n” ; if ( ab & bc ) cout 2 ) cout “okn” ; 避免不必要的求值 if ( a=0 | b=func() ) cout”uselessn”; 23:15:07185. 位操作位操作( Bit Operations ) 左移操作将整数最高位挤掉,

10、在右端补0。如: int a = 12; / a为:00000000000000000000000000001100 a = a在在整整数数的的高高位位挤挤一一个个0或或1进进去去(有有符符号号数数挤挤符符号号位位,无无符符号号数数挤挤 ),而而整整数数最最低低位位被被挤挤掉掉。如:如: short int a = -2; / 1111111111111110 a = a1; / a=-1 即1111111111111111 unsigned short int b = 65535; / 1111111111111111 b = b1; / b=32767即011111111111111123

11、:15:0720位与操作&将两个操作数每一位做与操作,如: int a = 12; / a为: 00000000000000000000000000001100 int b = 6; / b为: 00000000000000000000000000000110 / a & b为: 00000000000000000000000000000100 int cbit = a & b; int clogic = a & b; cout cbit “n” clogic “n” ; 结果为:( 比较 & 与 & 的区别 ) 4 123:15:0721位与操作 |将两个操作数每一位做或操作,如:将两个操作

12、数每一位做或操作,如: int a = 12; / a为: 00000000000000000000000000001100 int b = 6; / b为: 00000000000000000000000000000110 / a | b为: 00000000000000000000000000001110 int cbit = a | b; int clogic = a | b; cout cbit “n” clogic “n” ; 结果为:( 比较 | 与 | 的区别 ) 14 123:15:0722.增量操作增量操作(Increment Operations) 前增量与后增量: 操作数

13、为左值才能做增量操作 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+不是左值23:15:0723编译的贪吃特征: int a = 3, b = 5, c; c = a + b ; /错: 理解为a+ b c = a + b; /ok: a+ +b c =

14、a + b; /错: 理解为a+ +b c = a + b; /错: 理解为a+ + +b23:15:0724指针的增量操作:char s110, s2 = “hello” ;char *p1 = s1, *p2 = s2;while ( *p1+ = *p2+ ) ;等价于下列操作序列:while ( *p2 ) *p1 = *p2 ; p1+ ; p2+ ;*p1 = 0 ;12301661230082HelloHelp1p223:15:08257. 表达式副作用表达式副作用 ( Expressions Side Effects ) 表达式的值 由操作数和操作符决定. 操作符决定对操作数施

15、加的操作 操作的先后由优先级和结合性作主 访问操作数的先后,语言没有明确规定表达式的副作用 表达式的值因为访问操作数先后顺序不同而不同所引起23:15:0826使结合律失效 int a = 3, b = 5 ; c = a*b + +b; d = +b + a*b; / c与d不同 /c为21,d 为24 或反之使括号失效 int a = 3 , b = 5 ; int c = +b * ( a+b ) ; /可能为5423:15:0827副作用的根源 表达式中,多于一个的实体值发生改变 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次23:15:0828消除副作用分开语句写,如: c = a*b + +b ; 可以写成: c = b + a*b ; b+ ; 或者 b+ ; c = b + a*b ;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号