《运算符与表达式》PPT课件.ppt

上传人:小飞机 文档编号:1382507 上传时间:2022-11-17 格式:PPT 页数:60 大小:357.50KB
返回 下载 相关 举报
《运算符与表达式》PPT课件.ppt_第1页
第1页 / 共60页
《运算符与表达式》PPT课件.ppt_第2页
第2页 / 共60页
《运算符与表达式》PPT课件.ppt_第3页
第3页 / 共60页
《运算符与表达式》PPT课件.ppt_第4页
第4页 / 共60页
《运算符与表达式》PPT课件.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《《运算符与表达式》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《运算符与表达式》PPT课件.ppt(60页珍藏版)》请在三一办公上搜索。

1、教学目标:本章详细介绍了C语言提供的运算符和表达式的使用方法,要求通过本章的学习了解运算符的优先级和结合性,掌握的运算符和表达式类型及求值规则,掌握数据类型转换的方法。教学重点:重点掌握运算符:+,-,*,/,%,+,-,&,|,=,=,!=,=;不同数值型数据间的混合运算规则;算术表达式和赋值表达式的基本使用方法。教学难点:不同数值型数据间的混合运算规则;数据类型转换的方式。教学方法:理论教学与实践教学相合。,2.2 运算符与表 达 式,2.2.1表达式基础 2.2.2 算术运算符与算术表达式 2.2.3 关系运算符和关系表达式2.2.4逻辑运算法与逻辑表达式2.2.5 位运算符2.2.6赋

2、值运算符与赋值表达式 2.2.7逗号运算符与逗号表达式2.2.8条件运算符和条件表达式2.2.9 其它运算符,2.2.1 表达式基础,1. 表达式的组成,(1) 运算符 运算符又称操作符, 是一个符号, 它指示在一个或多个操作数上完成某种运算操作或动作。 C语言中, 除了输入、 输出及程序流程控制操作以外的所有基本操作都作为运算处理。 如, 赋值运算符“=”、 逗号运算符“, ”、 括号运算符“( )”。, 算术运算符有 +、 -、 *、 /、 %、 +、 - 关系运算符有 、 = 逻辑运算符有 !、 &、 | 位运算符有 、 、 |、 、 & 赋值运算符有 =、 +=、 -=、 *=、 /=

3、、 %=、 &= 、 |= 、 = 、 = 条件运算符有 ?: 逗号运算符有 , 指针运算符有 *、 & 求字节数运算符有 sizeof强制类型转换运算符有 (类型标识符)分量运算符有 、- /*参见结构体*/下标运算符 /*参见数组*/其它 ( ) 、 -,(2) 操作数 操作数是运算符的操作对象, 都是表达式(包括常量、变量、函数调用、复杂表达式)。 常量、变量、函数本身就是简单表达式, 从一般意义上讲, C语言中所有操作数都是表达式。复杂表达式由运算符连接简单表达式形成。,2. 表达式的书写 (1) C语言的表达式只能采用线性的形式书写。 例如: 应写成1/3.0+i+j*j*j。 应写

4、成(a+b)/(c+d)*e+f。,(2) C语言的表达式只能使用C语言中合法的运算符和操作数, 对有些操作必须调用库函数完成, 而且运算符不能省略。例如: r2应写成3.1415926*r*r。 应写成0.5*a*b*sin(alph), alph是事先定义好的整型变量。 |xy|(设x,y都是整数)应写成 abs(xy) |xy|(设x,y都是实数)应写成fabs(xy) y+2X 应写成y+pow(2, x)。,数学函数使用前应添加命令:#include ,运算符功能与操作数关系要求操作数个数要求操作数类型运算符优先级别结合方向结果的类型,3.学习运算符应注意,(1) 运算符优先级P30

5、表2-6,C语言将运算符的优先级划分为15级, 初等运算 ( )、 、 、 . 单目运算 !、 、 +、 、 、 (类型标识符)、 * 、 &、sizeof 右结合 算术运算 *、 /、% +、- 位运算符 关系运算符、 = =、 ! = 位运算符 & | 逻辑运算 & | 条件运算符 ?: 右结合 赋值运算=、 +=、 -=、 *=、 /=、 %=, =, =, &=, =, |= 右结合 逗号运算 ,,(2) 运算符的结合性 运算符的结合性是指, 优先级相同的运算符运算次序。包括从左到右进行(左结合性)和从右至左进行(右结合性)。右结合:C中只有以下三种运算符的结合性是右结合。单目运算(!

6、、 、 +、 -、 -、 *、 &)条件运算(?: )赋值运算(=、 +=、 -=、 *=、 /=、 %= 、=、 =、&=、 =、|= ),其余运算符均为左结合。,优先级 -(取负) + - * / % + -,2.2.2 算术运算符与算术表达式,1.算术运算符 双目:+、 -、 *、 /、 %(取余(模)) 左结合 单目:-(取负)、+(自加)、 -(自减) 右结合,高 低,(2)取余(模)运算符%注意:分子和分母必须同为整型数, %运算的符号只取决于第一个数(分子)的符号。,(1)除法运算符 / 两整数相除,结果为整数,舍去小数部分。 若有一个操作数是实数,则结果是实数。 如7/2的结果

7、为 ,而7.0/2的结果为 。,3,3.5,例 7%4 = 5.5%2,3,非法,(3)自加+、自减-运算符 (单目,右结合) 作用:使整型变量值加1或减1 种类:前置 +i 先执行i=i+1再使用i值,表达式+i的值是i+1 -i 先执行i=i-1再使用i值,表达式+i的值是i-1 ) 后置 i+ 先使用i值再执行i=i+1, 表达式i+的值是i i- 先使用i值再执行i=i-1, 表达式i-的值是i,注意:操作数只能是整型变量,如5+,(a+b)+ 。,Key-in a number: _,Key-in a number: 26_,main()int num;printf(“Key-in

8、a number: “);scanf(“%d”, ,Key-in a number: 26Value before being incremented: 26_,26,27,Key-in a number: 26Value before being incremented: 26Value after being incremented: 27 _,+num; /*结果如何?*/,此时,前缀+(-)和后缀+(-)相同,作用仅是增1(减1)。,例 main() int j,k,a,b,c; j=3; k=+j; printf(“%d,%d”,k,j); j=3; k=j+; printf(“%d

9、,%d”,k,j); j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; printf(“%d,%d,%d”,a,b,c); a=3;b=5;c=(a+)*b; printf(“%d,%d,%d”,a,b,c); ,/*相当于:j=j+1;k=j;*/,/*相当于:k=j; j=j+1;*/,/*相当于:j=j+1; printf(“%d”,j); */,/*相当于:printf(“%d”,j); j=j+1; */,/*相当于:a=a+1; c=a*b;*/,/*相当于:c=a*b ;a=a+1; */,2.算术表达式,

10、定义:用算术运算符和圆括号将运算对象连接起来的,并且符合C语言语法规则的式子。,单个的常量和变量都是算术表达式,是最简单的算术表达式。算术表达式的值是数值型。 +a+b/5 等价于 (+a)+(b/5),例 -i+ i=3; printf(“%d”,-i+);,例 -i+ -(i+) i=3; printf(“%d”,-i+); /-3,3. 运算符的组合问题 i+j如何解释? main() int i=3, j=5, k; k=i+j; printf(“%d,%d,%d”,i,j,k) ; ,/* i+j解释为(i+)+j*/,在表达式中出现多个字符时如何组合呢? 尽可能自左而右将若干字符组

11、合成一个运算符, 标识符、关键字也按同样的原则进行处理。,输出:4,5,8,【例】阅读下面程序写出运行结果include stdio.hmain( ) int i, j; i=j=5; printf(i+=%d, j=%dn, i+, j); printf(+i=%d, j=%dn, +i, j); printf(i+=%d, j=%dn, i+, j); printf(+i=%d, j=%dn, +i, j); printf(i=%d, j=%dn, i, j); ,运行结果: i+=5, j=5+i=7, j=3i+=7, j=3+i=9, j=1i=9, j=1,4.算术运算中的类型转换

12、 不同类型数据进行运算时, 要进行类型转换。类型转换有自动转换(又称隐含转换)与强制转换两种方式。 (1)自动类型转换 自动转换由系统自动完成, 适用于整型、实型和字符型数据的混合运算。 转换的规则是: 精度从低到高的顺序是,例如:计算表达式3.14+18/4+a 的值,3.14 + 18 / 4 + a,(1)计算18/4,结果4,int型,(2)先将3.14转换成double型,再将4转换成 double型4.0,计算3.144.0,结果是7.14(double),(3)先将a转换成int型值为97,再将97转换成double型97.0,计算7.1497.0,结果是104.14,doubl

13、e型,4,104.14,7.14,(2) 强制类型转换 格式: (类型名) (表达式) /*(类型名)是类型转换运算符,单目*/ 功能:将表达式的值类型强制转换成类型名指定的类型。 如: ,(int)(x+y),(int)x + y,注意:类型名两侧的()不能省略,将表达式x+y的值强制转换成整型,将表达式x的值强制转换成整型,(double)(3/2)(int)3.6,说明:强制转换得到所需类型的中间变量,原变量类型不变,当低精度强制转换成高精度,易造成精度损失 main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i);

14、输出:x=3.600000,i=3,2.2.3 关系运算符与关系表达式,1 关系运算符,关系运算符的优先级低于算术运算,高于赋值运算符。,种类:、 = 、 =、 != 均双目结合型:左结合 优先级 、 = 高于 =、 !=,例 ca+b /c(a+b) ab!=c /(ab)!=c a=bc /a=(bc),例如: 32 b*b-4*a*c=1e-6 x=y a%b!=0,2 关系表达式,关系表达式的值:是逻辑值“真”或“假”,用1和0表示。,设有定义 int a=3,b=2,c=1; 则: ab 的值为1 c=a 的值为0,【例题】计算表达式3=4+12!=5的值并给出求解过程,3 = 4

15、+ 1 2 != 5,5,1,0,1,注意 应避免对实数作相等或不等的判断如 1.0/3.0*3.0=1.0 结果为0可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,2.2.4逻辑运算符与逻辑表达式,逻辑运算符有:,!(非,单目,右结合)、 &(与)、 | (或),优先级: ! & |,结合性: !是右结合,&和|是左结合,高 低,a,b,!a,a&b,a|b,非0,0,非0,0,0,0,非0,非0,操作数: 0表示“假”, 非0表示“真”, 运算结果: 0表示“假”, 1表示“真”,真值表:,短路特性:&和|是一种短路运算。所谓短路运算, 是指在计算的过程中, 只要表达式的值能

16、确定, 便不再计算下去。(逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符),例如: (1) e1&e2, 若e1 为 0, 可确定表达式的值为 0, 不再计算e2。 (2) e1|e2, 若e1为真, 则可确定表达式的值为真, 也不再计算e2。,【例题1 】 main() int a=1,b=2,c=3,d=4,m=1,n=1; (m=ab),运行结果:m=0 n=1,【例题2】写出表达式53&a|54-!0 的求解过程,5 3 & a | 5 4 - ! 0,1,3,1,0,1,1,! + - - (取负)双目算术运算关系运

17、算双目逻辑运算(&高于|)赋值运算。,【例题3】 用逻辑表达式描述下列条件: 设x 和year都是整数: (1)x是 3 的倍数且x是偶数。,(2) 100 x200。(3) x等于2或8。(4) 年份year是否为闰年。,(x%3=0)&(x%2=0),(100=x)&(x=200),(x=2)|(x=8),(year %400=0)|(year%4=0) &(year%100!=0),例 若x=210 则 100=x=200的值为1,2.2.5 位运算符与位运算表达式 (了解),位运算符, 、 & 、 |、 、 取反(单目) 与 或 异或 左移 右移,优先级 ! + - - 双目算术运算(

18、*,/,%高于+,-) 双目关系运算符 (,=,=高于=,!=) 其它位运算符(& 高于高于 |) 双目逻辑运算(&高于|),高,低,结合方向“”的结合方向是右结合,其他为左结合。,1. 按位取反运算 单目运算符 对一个二进制数按位取反, 即 0 位变 1, 1 位变 0。,如:023的值是 。 (023是八进制23,要求结果也用8进制表示),1111111111101100,(0177754),()0000000000010011 (023),2.按位与运算符 & 双目运算符参加运算的两个运算量的对应位都为1,则该位的结果为1,否则为0。 如:计算023&032的值,(022),000000

19、0000010011 (023)(&) 0000000000011010 (032),0000000000010010,3.按位或运算符 | 双目运算符 参加运算的两个运算量的对应位都为0,则该位的结果为0,否则为1。 如:计算023|032的值,0000000000011011,0000000000010011 (023)(|) 0000000000011010 (032),(033),4.按位异或运算符 双目运算符参加运算的两个运算量的对应位相同,则该位的结果为0,否则为1。 如:计算023032的值 0000000000010011 (八进制无符号数023) () 00000000000

20、11010 (八进制无符号数032),0000000000001001 (八进制无符号数011),5.左移运算符 双目运算符 用来将一个数的各二进位全部左移若干位,左边移出的位丢失,右边空出的位补0。如:0232 (2) 0000000000010011 (023)当左移没有溢出时,左移一位相当于该数乘以2,左移n位相当于该数乘以2n。,00,00000000010011,(0114),6. 右移运算符 用来将一个数的各二进位全部右移若干位,右边移出的位丢失,左边空出的位补原来最左边的那位的值。如:0232(2) 0000000000010011 (023) 右移一位相当于除以2,右移n位相当

21、于除以2n。,(04),00000000000100,00,2.2.6 赋值运算符与赋值表达式,赋值运算符,=、 +=、 -=、 *=、 /=、 %=、&= 、 |= 、 = 、 = 均是双目运算。且优先级是同级,右结合优先级:仅为次低级,仅高于逗号“,”运算符。 赋值表达式的书写形式:,赋值表达式的值就是被赋值的变量的值,赋值表达式值的类型就是被赋值的变量的类型。,变量 OP 表达式,复合赋值运算的一般形式: OP代表任一双目算术运算符或位运算符。,例如:(1) int a=3; a+=2 ; (2) float x=1.2, y=2.1; y*=x+3.4 ; (3) int a=1, b

22、=2; b/=a+=1;,变量 OP= 表达式等价于: 变量 = 变量 OP (表达式),【例题】已知int a=12;计算表达式a+=a-=a*a 的值,a += a -= a * a,144,aa144即a-132,a-132 即a=-264,main() int a=12; printf(%d %dn, a ,a+=a-=a*a);,2.2.7 逗号表达式,逗号运算符: , 双目运算 左结合逗号表达式一般形式如下: 表达式1,表达式2,表达式3,表达式n 用途:用于将多个表达式连接成一个表达式。常用于for循环语句中运算过程:从左向右依次计算每个表达式的值,逗号表达式的值就是最右边表达式

23、的值,逗号表达式值的类型就是最右边表达式的值的类型。 优先级:最低 结合:左结合(自左向右)。 如表达式x=a=3, 6*x, 6*a, a+x的值为_。,6,【例题】 main() int a,x; printf(“%d %d %dn”,a,x,(x=a=3,+a,a+=4,a5); printf(%d %d %dn,a,x,x=(a=3,+a,a+=4,a5);,运行结果: 8 3 1 8 1 1,2.2.8条件运算符及条件表达式,条件表达式一般形式: 表达式 1? 表达式 2: 表达式 3,条件运算符 ? :,求解过程如右图。表达式值的类型: 取表达式2和3中值的类型中的精度较高者。,其

24、中,表达式1一般为关系表达式或逻辑表达式,表达式2和表达式3一般为同类型表达式。,三目运算符,图 条件表达式的求解过程,注意:条表达式2和表达式3只有一个被求解。,例如:32?1:1.5 的值为_,类型为_。 ,优先级:条件运算为倒数第 3 级, 高于赋值运算, 低于逻辑运算。结合性:右结合 条件运算符可嵌套使用,如 107 ? 2:3) /*表达式的值为3*/,例1 编写程序计算两个整数a和b的最大值,main() int a=3,b=4,max; max = ab?a:b; printf(“max(%d,%d)=%d”,a,b,max);,运行结果: max(3,4)=4,例2用条件运算符

25、求 a+|b|,main() int a=3,b=-4; printf(“%d+|%d|=%dn”,a,b,b0?a+b:a-b);,运行结果: 3+|-4|=7,【例3】读程序写结果 main() int a=1,b=2,c=3,d=4,m,n,e; m=1; n=1; printf(m=%d n=%d e=%dn, m, n, (a+d=b+c)?(m=ab):(n=cd); m=1; n=1; printf(m=%d n=%d e=%dn, m, n, (a+d!=b+c)?(m=ab):(n=cd);,运行结果: m=0 n=1 e=0 m=1 n=0 e=0,2.2.9 其它运算,1

26、. 取地址运算 运算符: &单目运算 右结合 优先级次高 操作数只能是变量, 得到变量的地址。 2.间接访问运算符 运算符: * 单目运算 右结合 优先级次高 操作数只能是地址(变量的地址或指针值) 用于取存储单元的内容.,如:int a=10,*p;p=则输出为:,3. 求字节数运算 运算符: sizeof单目运算 右结合 优先级次高 书写形式:sizeof(类型名或变量或表达式) 操作数可以是类型名, 也可以是变量、表达式, 用以 求得相应类型或数据所占的字节数。 ,10,10,10 /* a、*p和*&a等价 */,【例2.11】main() printf(%dn,sizeof(char

27、); printf(%dn,sizeof(int); printf(%dn,sizeof(long); printf(%dn,sizeof(float); printf(%dn,sizeof(double); ,4. 括号运算 在其它语言中括号是某些语法成分的描述方式, C语言将括号亦作为运算处理。 (1) 圆括号运算( ): 用于改变运算的优先级, 还用于将函数的参数与函数名相分离。 (2) 中括号运算 : 又称下标运算, 用来得到数组的分量下标变量。括号运算的优先级处于最高一级。,作业:P73 一、4,5,7,8,9,10,12,13二、程序填空题 1三、程序改错题 1四、程序分析题 1实

28、验2 写出测试程序的输出结果 实验课前检查,书后习题:P73 一、4,5,7,8,9,10,12,13,4.设m,n,a,b,c,d的值均为0,执行(m=a=b)|(n=c=d)后,m,n的值是( ) 0,0 0,1 1,0 1,15.设有定义:int a=5,b; 执行下列语句后,b的值不为2的是( ) b=a/2 b=6-(-a) b=a%2 b=a3?2:47.设有定义:int x,a,b;则执行完语句 x=(a=3,b=a-);后,x,a,b的值依次是( ) 3,3,2 3,2,2 3,2,3 2,3,28.若有定义:char ch=A;则表达式ch=(ch=A&ch=C)?(ch+3

29、2):ch的值是( ) A a Z z,9.设有定义:int a=3,b=4,*c=的输出是( ) 3,4 4,3 3,3 4,4,补充1.下列变量定义合法的是( )A. short _a = 1 - .1e-1 B. double b = 1+5e2.5 C. long do = 0 xfdaL D. float 2_and = 1-e-32.若已经定义x和y为double类型,则表达式:x=1,y=x+3/2的值是( )A.1 B.2 C. 2.0 D. 2.54.设int c=5;a=2+(c+=c+,c+8,+c),则 a=( ) A.13 B. 14 C. 15 D.165.表达式 (int)5.7*2.0的值为( )(A) 11.4 (B) 10 (C)10.0 (D) 11,二、程序填空题(在下列程序的 处填上正确的内容,使程序完整)1.下列程序的功能是把从键盘上输入的整数取绝对值后输出。main() int x; scanf(%d,三、程序改错题(下列每小题有一个错误,找出并改正)1. main() int a,b; float x,y,z; scanf(%f%f%f, ,四、程序分析题1.下面程序的输出结果是main() int x=3,y=3,z=1; printf(%d %dn,(+x,y+),z+2);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号