运算符与表达式课件.ppt_第1页
运算符与表达式课件.ppt_第2页
运算符与表达式课件.ppt_第3页
运算符与表达式课件.ppt_第4页
运算符与表达式课件.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

教学目标: 本章详细介绍了C语言提供的运算符和表达式的使用方法,要求通过本章的学习了解运算符的优先级和结合性,掌握的运算符和表达式类型及求值规则,掌握数据类型转换的方法。 教学重点: 重点掌握运算符:+,-,*,/,%,+,-,&,|,=,=,!=,=; 不同数值型数据间的混合运算规则; 算术表达式和赋值表达式的基本使用方法。 教学难点: 不同数值型数据间的混合运算规则; 数据类型转换的方式。 教学方法:理论教学与实践教学相合。,2.2 运算符与表 达 式,2.2.1表达式基础 2.2.2 算术运算符与算术表达式 2.2.3 关系运算符和关系表达式 2.2.4逻辑运算法与逻辑表达式 2.2.5 位运算符 2.2.6赋值运算符与赋值表达式 2.2.7逗号运算符与逗号表达式 2.2.8条件运算符和条件表达式 2.2.9 其它运算符,2.2.1 表达式基础,1. 表达式的组成,(1) 运算符 运算符又称操作符, 是一个符号, 它指示在一个或多个操作数上完成某种运算操作或动作。 C语言中, 除了输入、 输出及程序流程控制操作以外的所有基本操作都作为运算处理。 如, 赋值运算符“=”、 逗号运算符“, ”、 括号运算符“( )”。, 算术运算符有 +、 -、 *、 /、 %、 +、 - 关系运算符有 、 = 逻辑运算符有 !、 &、 | 位运算符有 、 、 |、 、 & 赋值运算符有 =、 +=、 -=、 *=、 /=、 %=、 &= 、 |= 、 = 、 = 条件运算符有 ?: 逗号运算符有 , 指针运算符有 *、 & 求字节数运算符有 sizeof 强制类型转换运算符有 (类型标识符) 分量运算符有 、- /*参见结构体*/ 下标运算符 /*参见数组*/ 其它 ( ) 、 -,(2) 操作数 操作数是运算符的操作对象, 都是表达式(包括常量、变量、函数调用、复杂表达式)。 常量、变量、函数本身就是简单表达式, 从一般意义上讲, C语言中所有操作数都是表达式。复杂表达式由运算符连接简单表达式形成。,2. 表达式的书写 (1) C语言的表达式只能采用线性的形式书写。 例如: 应写成1/3.0+i+j*j*j。 应写成(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表2-6,C语言将运算符的优先级划分为15级, 初等运算 ( )、 、 、 . 单目运算 !、 、 +、 、 、 (类型标识符)、 * 、 &、sizeof 右结合 算术运算 *、 /、% +、- 位运算符 关系运算符、 = =、 ! = 位运算符 & | 逻辑运算 & | 条件运算符 ?: 右结合 赋值运算=、 +=、 -=、 *=、 /=、 %=, =, =, &=, =, |= 右结合 逗号运算 ,,(2) 运算符的结合性 运算符的结合性是指, 优先级相同的运算符运算次序。包括从左到右进行(左结合性)和从右至左进行(右结合性)。 右结合:C中只有以下三种运算符的结合性是右结合。 单目运算(!、 、 +、 -、 -、 *、 &) 条件运算(?: ) 赋值运算(=、 +=、 -=、 *=、 /=、 %= 、=、 =、&=、 =、|= ),其余运算符均为左结合。,优先级 -(取负) + - * / % + -,2.2.2 算术运算符与算术表达式,1.算术运算符 双目:+、 -、 *、 /、 %(取余(模)) 左结合 单目:-(取负)、+(自加)、 -(自减) 右结合,高 低,(2)取余(模)运算符% 注意:分子和分母必须同为整型数, %运算的符号只取决于第一个数(分子)的符号。,(1)除法运算符 / 两整数相除,结果为整数,舍去小数部分。 若有一个操作数是实数,则结果是实数。 如7/2的结果为 ,而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 a number: “); scanf(“%d”, ,Key-in a number: 26 Value before being incremented: 26 _,26,27,Key-in a number: 26 Value before being incremented: 26 Value 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,%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.算术表达式,定义:用算术运算符和圆括号将运算对象连接起来的,并且符合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*/,在表达式中出现多个字符时如何组合呢? 尽可能自左而右将若干字符组合成一个运算符, 标识符、关键字也按同样的原则进行处理。,输出:4,5,8,【例】阅读下面程序写出运行结果 include stdio.h main( ) 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=3 i+=7, j=3 +i=9, j=1 i=9, j=1,4.算术运算中的类型转换 不同类型数据进行运算时, 要进行类型转换。类型转换有自动转换(又称隐含转换)与强制转换两种方式。 (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,double型,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); 输出: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 + 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表示“真”,真值表:,短路特性:&和|是一种短路运算。所谓短路运算, 是指在计算的过程中, 只要表达式的值能确定, 便不再计算下去。 (逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符),例如: (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,! + - - (取负) 双目算术运算 关系运算 双目逻辑运算(&高于|) 赋值运算。,【例题3】 用逻辑表达式描述下列条件: 设x 和year都是整数: (1)x是 3 的倍数且x是偶数。,(2) 100x200。 (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 位运算符与位运算表达式 (了解),位运算符, 、 & 、 |、 、 取反(单目) 与 或 异或 左移 右移,优先级 ! + - - 双目算术运算(*,/,%高于+,-) 双目关系运算符 (,=,=高于=,!=) 其它位运算符(& 高于高于 |) 双目逻辑运算(&高于|),高,低,结合方向 “”的结合方向是右结合,其他为左结合。,1. 按位取反运算 单目运算符 对一个二进制数按位取反, 即 0 位变 1, 1 位变 0。,如:023的值是 。 (023是八进制23,要求结果也用8进制表示),1111111111101100,(0177754),()0000000000010011 (023),2.按位与运算符 & 双目运算符 参加运算的两个运算量的对应位都为1,则该位的结果为1,否则为0。 如:计算023&032的值,(022),0000000000010011 (023) (&) 0000000000011010 (032),0000000000010010,3.按位或运算符 | 双目运算符 参加运算的两个运算量的对应位都为0,则该位的结果为0,否则为1。 如:计算023|032的值,0000000000011011,0000000000010011 (023) (|) 0000000000011010 (032),(033),4.按位异或运算符 双目运算符 参加运算的两个运算量的对应位相同,则该位的结果为0,否则为1。 如:计算023032的值 0000000000010011 (八进制无符号数023) () 0000000000011010 (八进制无符号数032),0000000000001001 (八进制无符号数011),5.左移运算符 双目运算符 用来将一个数的各二进位全部左移若干位,左边移出的位丢失,右边空出的位补0。 如:0232 (2) 0000000000010011 (023) 当左移没有溢出时,左移一位相当于该数乘以2,左移n位相当于该数乘以2n。,00,00000000010011,(0114),6. 右移运算符 用来将一个数的各二进位全部右移若干位,右边移出的位丢失,左边空出的位补原来最左边的那位的值。 如:0232 (2) 0000000000010011 (023) 右移一位相当于除以2,右移n位相当于除以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=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循环语句中 运算过程:从左向右依次计算每个表达式的值,逗号表达式的值就是最右边表达式的值,逗号表达式值的类型就是最右边表达式的值的类型。 优先级:最低 结合:左结合(自左向右)。 如表达式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中值的类型中的精度较高者。,其中,表达式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用条件运算符求 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. 取地址运算 运算符: &单目运算 右结合 优先级次高 操作数只能是变量, 得到变量的地址。 2.间接访问运算符 运算符: * 单目运算 右结合 优先级次高 操作数只能是地址(变量的地址或指针值) 用于取存储单元的内容.,如: int a=10,*p; p= 则输出为:,3. 求字节数运算 运算符: sizeof单目运算 右结合 优先级次高 书写形式:sizeof(类型名或变量或表达式) 操作数可以是类型名, 也可以是变量、表达式, 用以 求得相应类型或数据所占的字节数。 ,10,10,10 /* a、*p和*&a等价 */,【例2.11】 main() printf(“%dn“,sizeof(char); 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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论