1、12/24/1第第3章章 运算符和表达式运算符和表达式 3.1 表达式表达式3.2 算术运算符算术运算符3.3 赋值运算符赋值运算符3.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算3.5 自增、自减运算符自增、自减运算符3.6 逗号运算符逗号运算符3.7 其它运算符其它运算符本章小结本章小结习题参考答案习题参考答案 12/24/23.1 表达式表达式一表达式一表达式表达式是由运算对象、运算符按照C语言的语法规则构成的符号序列。表达式可以通过运算产生一个结果或完成某种操作。C语言的表达式功能很强,也很复杂,它提供了许多种运算符12/24/33.1 表达式表达式二运算符二运算符运算
2、符是C语言里用于描述对数据进行运算的特殊符号。C语言有三大运算符:算术、关系与逻辑、位操作。C语言还有一些已超出了一般运算符概念的特殊运算符。12/24/43.1 表达式表达式三运算符和表达式的分类三运算符和表达式的分类1运算符的分类运算符的分类 按在表达式中与运算对象的关系(所需要运算对象的个数)可以分为:F单目运算符F双目运算符F三目运算符学习运算符应注意:v运算符功能v与运算量关系l要求运算量个数l要求运算量类型v运算符优先级别v结合方向v结果的类型12/24/53.1 表达式表达式 按它们在表达式中所起的作用又可以分为:算术运算符:+、-、*、/、%赋值运算符:=、+=、-=、*=、/
3、=、%=、&=、|=、=、=自增自减运算符:+、-关系运算符:、=、=、!=逻辑运算符:!、&、|条件运算符:?:位运算符:、&、|、逗号运算符:,其它运算符:()、-、.、(类型名)、*、&、sizeof12/24/63.1 表达式表达式2表达式的分类表达式的分类 按照运算符要求运算对象的个数可以分为:F单目表达式F双目表达式F三目表达式 按照运算符在表达式中的作用,可以分为:F算术表达式赋值表达式F自增、自减表达式F关系表达式F逻辑表达式F逗号表达式12/24/73.1 表达式表达式四优先级和结合性四优先级和结合性优先级指同一个表达式中不同运算符进行运算时的优先次序。结合性是针对同一优先级
4、的多个运算符而言的,它是指同一个表达式中相同优先级的多个运算是自左向右进行运算还是自右向左进行运算。关于C语言运算符的含义、类型、优先级、结合性等问题见附录B。12/24/83.2 算术运算符算术运算符一算术运算符一算术运算符 F+:加法运算符F-:减法运算符F*:乘法运算符F/:除法运算符当运算对象均为整数时运算结果也为整数。(P43)F%:求余运算符(模运算符)。要求%两侧运算对象均为整型数据。算术运算符均为双目运算符,均具有左结合性。*、/、%的优先级为3级,+、-的优先级为4级。12/24/9算术运算符算术运算符v基本算术运算符:基本算术运算符:+-*/%l结合方向:从左向右结合方向:
5、从左向右l优先级:优先级:-*/%-+-(2)(3)(4)(2)(3)(4)说明:说明:l“-”可为可为单目单目运算符时运算符时,右结合性右结合性l两整数相除,结果为整数两整数相除,结果为整数l%要求两侧均为整型数据要求两侧均为整型数据l+-+-*/运算的两个数中有一个数为实数,运算的两个数中有一个数为实数,结果是结果是doubledouble型型例 5/2 =-5/2.0 =例 5%2 =-5%2 =1%10 =5%1 =5.5%2例 5/2 =2 -5/2.0=-2.5例 5%2 =1 -5%2 =-1 1%10 =1 5%1 =0 5.5%2 ()v简单赋值运算符简单赋值运算符 (见P4
6、4例3.1、3.2)l符号:符号:=l格式:格式:变量标识符变量标识符=表达式表达式l作用:将一个数据(常量或表达式)赋给一个变量作用:将一个数据(常量或表达式)赋给一个变量l左侧必须是变量,不能是常量或表达式左侧必须是变量,不能是常量或表达式例 a=3;d=func();c=d+2;例 3=x-2*y;a+b=3;()v类型转换类型转换l赋值转换赋值转换规则规则:使赋值号右边表达式值使赋值号右边表达式值自动自动转换成其转换成其左边变量的类型左边变量的类型例 float f;int i=10;f=i;则 f=10.0例 int i;i=2.56;/结果i=2;12/24/163.3 赋值运算符
7、赋值运算符二复合赋值运算符二复合赋值运算符在赋值运算符“=”之前加上其它一些双目运算符可以构成复合赋值运算符,用于完成运算、赋值组合操作。C语言中复合赋值运算符的一般形式为:运算符=其中“运算符”可以是:+、-、*、/、%、|、&、所构成的复合赋值运算符是:+=、-=、*=、/=、%=、|=、&=、=、=所有的赋值运算符包括复合赋值运算符的优先级全部相同,均为右结合性。12/24/17v复合赋值运算符复合赋值运算符l种类种类:+=-=*=/=%=&=|=l含义:含义:exp1 op=exp2exp1 op=exp2 exp1=exp1=exp1exp1 op exp2 op exp2a+=3a
8、=a+3x*=y+8x=x*(y+8)x%=3x=x%312/24/183.3 赋值运算符赋值运算符由复合赋值运算符将一个变量和一个表达式连接起来的式子称为复合赋值表达式。它的一般形式为:变量名 复合赋值运算符 表达式复合赋值表达式的作用等价于:变量名=变量名 运算符(表达式)即先将变量和表达式进行复合赋值运算符所指定的运算,然后将运算结果赋给变量。复合赋值表达式的值就是复合赋值运算符左侧变量被赋值以后的值。12/24/193.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算一自动类型转换一自动类型转换 (p46)整型、实型、字符型数据间可以混合进行算术运算。进行运算时,参与运算的
9、操作数的数据类型要一致,若参与运算的数据类型不同,先要将其转换为相同的类型,然后再进行运算。12/24/203.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算一自动类型转换一自动类型转换横向箭头表示必须的转换,纵向箭头表示当运算符两侧的运算对象为不同类型时的转换,这些转换都是由系统自动进行的。P47高低doublelongunsignedintchar,shortfloat12/24/21doublefloatlongunsignedintchar,short低高说明说明:必定的转换必定的转换运算对象类型不同时转换运算对象类型不同时转换例例 char ch;int i;float
10、 f;double d;ch/i +f*d -(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+a +i*f -d/l例例 int i;float f;double d;long l;P47例3.4#includemain()int a2,b5;char ca;float x2.5,y3.3,z;zc/2x/ay*b;printf(%fn,z);12/24/223.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算二强制类型转换二强制类型转换强制类型转
11、换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)(类型说明符)是类型转换运算符,单目运算,优先级别为2级,具右结合性。在类型转换运算符的右侧跟上表达式形成类型转换表达式,其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。12/24/23强制转换(见强制转换(见P48P48强制类型转换运算符部分)强制类型转换运算符部分)v一般形式:一般形式:(类型名类型名)(表达式)表达式)例:例:(int)(x+yint)(x+y)(int)x+yint)x+y (double)(3/2)(double)(3/2)(int)3.6 (int)3.6 v说明:强制转换得到说明:强制
12、转换得到 所需类型的中间变量,所需类型的中间变量,原变量类型不变原变量类型不变 例例:#include main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);结果:结果:x=3.600000,i=3较高类型向较低类型转换时可能发生12/24/24例例3.5 对比以下两个程序(P48)#include#includemain()main()int a,b;int a,b;float x;float x;a10;a10;b4;b4;x3.2a/b;x3.2+(float)a/b;printf(“x%fn“,x);printf(x%fn
13、“,x);?12/24/253.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算三强制类型转换三强制类型转换赋值表达式的类型转换当赋值运算符两侧的运算对象数据类型不同时,系统也将进行自动类型转换自动类型转换,转换规则为:将赋值运算符右侧表达式的类型转换为左侧变量的类型。12/24/26例例3.6 赋值运算的自动类型转换。#includemain()char ca;int a321,b,i;unsigned m4294967295,n;float x2.5,y;double d12345678.987;printf(c%c,a%d,m%u,x%f,d%fn“,c,a,m,x,d);c
14、a;b=x;ya;xd;im;nl;printf(c%c,b%d,y%f,x%f,i%d,n%un“,c,b,y,x,i,n);/*注意这个m的值有些特殊*/12/24/273.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算(1)浮点型与整型相互转换浮点型与整型相互转换 将浮点数据(包括单、双精度)转换为整型时,将舍弃浮点数的小数部分,只保留整数部分。(2)单、双精度浮点型相互转换单、双精度浮点型相互转换 由于C语言中的浮点值总是用双精度表示的,所以float型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,先截取双精度实
15、数的前7位有效数字,然后再赋给单精度类型的变量。12/24/283.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算(3)字符型与整型相互转换字符型与整型相互转换将整型数据赋给字符型变量时,由于整型数据用两个字节存放,而字符型数据用一个字节存放,所以只保留其低8位赋给字符型变量,高位部分舍弃。字符型数据赋给整型变量时,将字符数据的8位放入整型变量的低8位中,有些编译系统在整型变量的高8位补0;而有些编译系统(如Turbo C),根据字符的最高位为0或1将高8位全部补0或补1。12/24/293.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算(4)整型与长整型相互转换整
16、型与长整型相互转换长整型数据赋值给整型变量时,将低16位值送给整型变量,将高16位截断舍弃。将整型数据赋值给长整型变量时,将整型数据的16位送到长整型变量的低16位中,根据整型数据符号位为0或1,在长整型的高16位全部补0或1,以保持数值不改变。12/24/303.4 不同数据类型数据间的混合运算不同数据类型数据间的混合运算(5)无符号整数与有符号整数相互转换无符号整数与有符号整数相互转换若占据同样长度存储单元的有符号、无符号整型相互转换时,是原样赋值,内部的存储方式不变,但外部值可能改变。若占据不同长度存储单元的有符号、无符号整型之间转换,先参照(4)中所述方式进行转换,再按上面字节数相同的
17、方式直接赋值。12/24/313.5 自增、自减运算符自增、自减运算符一自增自减运算符、表达式一自增自减运算符、表达式F+:自增运算符,使变量的值增加1。F-:自减运算符,使变量的值减少1。自增、自减运算符均为单目运算符,优先级为2,具右结合性。12/24/323.5 自增、自减运算符自增、自减运算符一自增自减运算符、表达式一自增自减运算符、表达式自增、自减运算符都有两种用法:F前置运算将+或-运算符置于变量之前,一般形式为:+变量、-变量。其功能是使变量的值增(减),然后再以变化后的变量值参与其它运算,即先增减、后运算。F后置运算将+或-运算符置于变量之后,一般形 式为:变量+、变量-。其功
18、能是变量先参与其它运算,然后再使变量的值增(减),即先运算、后增减。12/24/33v自增、自减运算符自增、自减运算符+l作用:使变量值加作用:使变量值加1 1或减或减1 1l种类:种类:u前置前置 +i,-i (先执行先执行i i+1+1或或i-1i-1,再使用再使用i i值)值)u后置后置 i+,i-(先使用先使用i i值值,再执行再执行i i+1+1或或i-1i-1)例例j=3;k=+j;j=3;k=+j;j=3;k=j+;j=3;k=j+;j=3;printf(j=3;printf(“%d%d”,+j);,+j);j=3;printf(j=3;printf(“%d%d”,j+);,j+
19、);a=3;b=5;c=(+a)a=3;b=5;c=(+a)*b;b;a=3;b=5;c=(a+)a=3;b=5;c=(a+)*b;b;/k=4,j=4/k=4,j=4/k=3,j=4/k=3,j=4/4,j=4/4,j=4/3,j=4/3,j=4/c=20,a=4/c=20,a=4/c=15,a=4/c=15,a=4l几点说明:几点说明:例例-i+-i+i=3;printf(i=3;printf(“%d%d”,-i+);,-i+);-(i+)-(i+)/-3/-3 u+-+-不能用于常量和表达式不能用于常量和表达式,如如 5+5+,(a+ba+b)+)+u+-+-结合方向:结合方向:自右向左
20、自右向左u优先级:优先级:-+-*/%-+-(2)(3)(4)(2)(3)(4)u该运算符常用于循环语句中,使循环变量加减该运算符常用于循环语句中,使循环变量加减1 1v有关表达式使用中的问题说明有关表达式使用中的问题说明l不同系统对运算符和表达式的处理次序不同,尽可能不同系统对运算符和表达式的处理次序不同,尽可能写通用性强的语句写通用性强的语句l不要写有歧义和不知系统如何执行的程序不要写有歧义和不知系统如何执行的程序P51例3.712/24/353.5 自增、自减运算符自增、自减运算符二关于自增自减运算符、表达式的说明二关于自增自减运算符、表达式的说明F自增、自减运算符实际上属于赋值运算符,
21、不能应用于常量和表达式,操作对象只能是变量。F一般自增自减表达式或是以表达式语句的形式出现,或是出现在for循环语句中使循环控制变量加(减),或应用于指针变量,使指针指向下(上)一个地址。其它将自增自减表达式应用于另一个表达式内部的形式,在尚未熟练掌握时尽量不去使用。F最好不要使用诸如i+j、(i+)+(i+)此类容易产生歧义或错误的形式。12/24/36例例3.8 自增、自减运算符的特别用法#includemain()int i,j,m,n;i5;j5;m(i)(i);n(j)(j);printf(%d,%dn,m,n);printf(%d,%dn,i,j);注意:、&、|、逗号运算符和逗号
22、表达式逗号运算符和逗号表达式v形式:形式:表达式表达式1,表达式表达式2,表达式表达式nv结合性结合性:从左向右从左向右v优先级优先级:15,级别最低级别最低v逗号表达式逗号表达式的值:等于表达式的值:等于表达式n的值的值v用途:用途:常用于循环常用于循环for语句中语句中例 a=3*5,a*4 a=3*5,a*4,a+5例 x=(a=3,6*3)x=a=3,6*a例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);/a=15,表达式值60/a=15,表达式值20/赋值表达式,表达式值18,x=18/逗号表
23、达式,表达式值18,x=3/1,2,3/3,2,312/24/39例例3.9 逗号运算符 (P53)#includemain()int a,b,i,i,k;i(a3,a*5);k(jb5,ab);printf(%d,%d,%d,%d,%dn“,a,b,I,j,k);printf(%dn“,5,6);printf(%dn“,(5,6);12/24/403.7 其它运算符其它运算符sizeof的使用形式比较像是函数调用,但它是一种运算符。其一般应用形式为:sizeof(运算对象)sizeof运算的功能是求出运算对象在计算机的内存中所占用的字节数。其中运算对象可以是数据类型说明符或表达式,当运算对象
24、是表达式时括号可省略。sizeof是单目运算符,优先级别为2,具右结合性,运算的结果是整型。12/24/41例例3.10 sizeof运算符(P54)#includemain()int a,b,c,d;double x1.23;asizeof(long);bsizeof(x3);csizeof x3;dsizeof(ab123abcn);printf(%d,%d,%d,%dn,a,b,c,d);12/24/42请问下面的程序输出什么?#includeint main()int i;i=10;printf(i:%dn,i);printf(sizeof(i+)is:%dn,sizeof(i+);p
25、rintf(i:%dn,i);return 0;结果:102 对吗?对吗?11结果是:10210Why?12/24/43本章小结本章小结本章主要介绍了运算符与表达式,其中涉及到的重要概念有:运算对象的个数、运算优先级、结合性、类型转换等。运算符是C语言里用于描述对数据进行运算的特殊符号。表达式是由运算符连接常量、变量、函数所组成的式子,每个表达式都有一个值和类型。表达式求值按运算符的优先级和结合性所规定的顺序进行。12/24/44本章小结本章小结1运算符优先级和结合性运算符优先级和结合性一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数
26、运算符具有左结合性,而单目运算符、三目运算符、赋值运算符具有右结合性。12/24/45本章小结本章小结2算术运算符算术运算符(1)整数相除是做整除,结果也为整数。(2)求余运算要求运算对象均为整型。(3)注意运算时的类型转换问题。(4)注意C语言表达式与数学公式在形式上的差异12/24/46本章小结本章小结3赋值运算符赋值运算符(1)赋值表达式的左边必须为变量。(2)复合赋值运算符的优先级全部在同一级别。(3)注意赋值时的类型转换。12/24/47本章小结本章小结4类型转换类型转换(1)自动转换:在不同类型数据的混合运算中,由系自动转换:在不同类型数据的混合运算中,由系统自动实现转换,由少字节
27、类型向多字节类型转换。统自动实现转换,由少字节类型向多字节类型转换。(2)强制转换:由强制转换运算符完成转换。强制转换:由强制转换运算符完成转换。(3)赋值时的类型转换:不同类型的量相互赋值时也赋值时的类型转换:不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左由系统自动进行转换,把赋值号右边的类型转换为左边变量的类型。边变量的类型。(4)无论是系统所做的自动类型转换还是强制类型转无论是系统所做的自动类型转换还是强制类型转换,都只是将常量、变量、表达式的值进行转换去参换,都只是将常量、变量、表达式的值进行转换去参与运算,不会改变变量的数据类型和值。与运算,不会改变变量的数据类型和值。12/24/48本章小结本章小结5自增、自减运算符自增、自减运算符(1)自增、自减其实也是赋值运算,只能针对变量做自增、自减运算。(2)注意前置运算(先增减后运算)与后置运算(先运算后增减)对所在表达式的影响的不同6逗号运算符逗号运算符(1)逗号表达式的值取最后一个表达式的值。(2)逗号运算符的优先级最低。7其它运算符其它运算符(1)sizeof是运算符,不是函数名。(2)sizeof求表达式在内存中所占的字节数。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。