资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,教学内容:,4.1 数据运算的基本概念,4.2 算术运算 4.3 赋值运算,4.4 关系运算 4.5 逻辑运算,4.6 自增自减运算 4.7 其它运算,教学要求:,1.,掌握各种,运算符的优先级、结合方向。,2.,掌握各种,数据运算的运算符的运算,。,3.,掌握混合运算时的类型转换,规则,。,第 4 章,数 据 运 算,4.1,数据运算的基本概念,1.运算符,C,语言具有丰富的运算符。,Turbo C,提供了44种数据操作运算符,其使用范围很宽。,运算符,是一种向编译程序说明特定的运算或操作的符号。每一种运算符都具有特定的数据操作规则。,2.运算符的分类,(1)按运算符要求运算对象的个数分类:单目运算符、双目运算符、三目运算符。,(2)按其数据操作功能分类:算术运算符、关系运算符、逻辑运算符、位运算符、,C,的特殊运算符。,3.运算符的优先级,当一个表达式中出现多个运算符时,表达式的求值运算按运算符的优先级别从高到低的顺序执行。在,C,语言中,将44种运算符的优先级从高到低共分为15个等级。如表4.1所示。,4.运算符的结合性,(1)运算符的,左结合性,:当一个操作数两侧的运算符具有相同的优先级时,操作数先与左边的运算符结合,即自左至右的结合方向。,(2)运算符的,右结合性,:即自右至左的结合方向。,除,单目,运算符、,赋值,运算符和,条件,运算符是右结合性外,其它运算符都是左结合性。,初等运算符,()、,单目运算符,!、+、,、+、,、(类型),算术运算符,、/、%,+、,关系运算符,、=,=、!=,逻辑运算符,&、,条件运算符,?:,赋值运算符,=、+=、,=、,=、/=、%=,逗号运算符,各类运算符的优先级(,从高至低,):,高,低,5.,表达式,用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合语言语法规则的式子,称为表达式。,(1),简单表达式:表达式中只有一个运算符的表达式,被称为普通表达式,或称为简单表达式。,(2),复合表达式:有多个运算符构成的表达式,被称为复合表达式。,(3),特殊表达式:在使用中,单个常量、变量和函数(返回值)都可以看作是一个表达式,称为特殊表达式。,6.表达式求值,每一个,C,的合法表达式,经过运算一定能得到一个确定的数值,这个数值被称为表达式的值。,复合表达式的求解过程如下,:,(1),按运算符的优先级高低次序执行。例如,先乘除后加减。,(2),如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按语言规定的结合方向(结合性)进行。,4.2,算 术 运 算,1.,五种基本算术运算符,+,(加法),-,(减法/取负),*,(乘法),/,(除法),%,(求余数),2.,运算符的优先级与结合性,(,1,)算术运算符的优先级,先,取负,、再,乘、除、求余,,最后,加、减法,(,2,)运算符的结合性为:自左至右的结合方向。,3.算术表达式,由算术运算符和括号将运算对象连接起来形成的运算式子,称为算术表达式,例如,,3+6*9,、,(,x+y)/2 1,4.,算术表达式的值,除,C,语言,的特定规则外,,C,语言中,算术运算与数学中的算术运算规则相同,经过有限次加减除等运算,最后求得,表达式的值。,例如,,表达式,3+6*9,的值:,57,5.,C,语言,算术运算的特定规则,(,1,),两个整数相除,其商为整数,小数部分被舍弃,。,例如,,表达式:,5/2,的值为,2,,不是,2.5,。,而表达式:,12.6/3,的值为,4.2,,,不是,4,。,(,2)关于求余数运算,要求求余运算符两侧的操作数均为整型数据,否则出错。,例如,,表达式:,5%3,的,值,为,2,。而,5.3,2,出错,,不是合法,表达式,。,(,3,),C,语言的,整型、实型和字符型数据间可以混合运算。,例,4.1,输出算术表达式的结果,#,include,main(),int,a,b,c1;,float x,y,z;,a=85;b=18;x=42.6;y=28.3;,c1=a/b,*,9+a%b;,z=x/y,(x+y)/2 1;,printf,(c1=%dn,c1);,printf,(z1=%fn,z);,程序运行结果,:,c1=49,z1=39.172222,a/b,的值是,4,,4,乘,9,得,36,,a%b,的值,13,36+13,得,49,混合运算中数据类型的转换:,6.,数据类型转换,1,)横向向左的箭头,表示必须的转换。,char,和,short,型必须转换成,int,型,,float,型必须转换成,double,型。,2,)纵向向上的箭头,表示不同类型的转换方向。,(,1,)整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。,一个运算符两侧的操作数的数据类型不同,则按“先转换、后运算”的原则,首先将数据自动转换成同一类型,然后进行运算。,例如,,int,型,与,double,型数据进行,混合运算,,则先将,int,型数据转换成,double,型,然后在两个同类型的数据间进行运算,,结果为,double,型。,注意箭头方向只表示数据类型由低向高转换.,例,4.2,整型、实型数据间混合运算,#,include,main(),int,a;float x;,a=35;x=42.63;,printf,(%fn,a+x);,printf,(%fn,x/a);,程序运行结果,:,77.630001,1.218000,自动将,X,的,数据转换成,double,型,再将,int,型变量,a,数据转换成,double,型,进行加法运算,运算,结果为,double,型,7.,数据类型强制转换,数据类型允许强制转换,一般格式为:,(数据类型)(表达式),例如:,(,int,)(x+y),/,*,将,x+y,的结果转换成,int,型*,/,(1),当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。,例如:,(,double)a,/,*,将变量,a,的值转换成,double,型*,/,(,float)5/2,(,等价于,(,float)(5)/2,),/,*,将,5,转换成实型再除以,2,(,=2.5,)*,/,(,float)(5/2),/*,将5整除2的结果:2,转换成实型数:2.0*/,(2),强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。,例如,,(,double)a,只是将变量,a,的值转换成一个,double,型的中间量,其数据类型并未转换成,double,型。,例,4.3,数据类型强制转换,#,include,main(),int,a;float x,y;,a=85;x=42.6;y=19.3;,printf,(“1-%ft,(float)5/2,);,printf,(“2-%fn,(float)(5/2);,printf,(“3-%dt,(,int,)(x+y),);,printf,(“4-%fn,(double)a,);,程序运行结果:,1-2.500000 2-2.000000,3-61 4-85.000000,4.3 赋 值 运 算,1.赋值运算,赋值运算符:,“,=,”,,它的作用是将一个表达式的值赋给一个变量。,给变量赋值的一般形式为:,变量,=,表达式,2,赋值运算符的优先级,赋值运算符的优先级低于算术运算符,也低于关系运算符和逻辑运算符。,3赋值运算结合方向,赋值运算结合方向:自右向左结合。,4.赋值表达式,由赋值运算符或复合赋值运算符,将一个变量和一个表达式连接起来的表达式,称为赋值表达式。,(,1,),赋值表达式,一般格式,变量,赋值运算符,表达式,例如,,a=5 、b=x+3,*,y,(,2,),赋值表达式的值,任何一个表达式都有一个值,赋值表达式也不例外。,被赋值变量的值,就是赋值表达式的值。,例如,,a=5,赋值表达式,变量,a,的值,是,赋值表达式的值,是,。,例如,,int,x;float y;,x=5,y=(float)5/2,如果表达式值的类型,与被赋值变量的类型不一致,但都是数值型或字符型时,系统自动地将表达式的值转换成被赋值变量的数据类型,然后再赋值给变量。,表达式,x=5,的值:,5,变量,x,的值:,5,表达式,y=(float)5/2,的值:,2,.0,变量,y,的值:,2,.0,(,3,),赋值运算结合方向:右左,例如:,x=y=65,等价于,x=(y=65),操作数,y,是先与,右,边的运算符结合,即,先将,65,赋值给变量,y,变量,y,的,值是,65,表达式,y=65,的,值是,65,再做,左,边,赋值运算,,即,将,表达式,y=65,的,值,65,,赋值给变量,x,变量,x,的,值是,65,表达式,x=,y=65,的,值是,65,5.复合赋值运算,复合赋值运算符:是由赋值运算符之前再加一个双目运算符构成的。,(1),复合赋值运算的一般格式为:,变量,双 目 运 算 符=,表达式,复合赋值运算符,它等价于:,变量=变量,双目运算符,(表达式),例如:,y,*,=x+6,等价于,y=y,*,(x+6),不是,y=y,*,x+6,当表达式为简单表达式时,表达式外的一对圆括号才可缺省,否则可能出错。,例如:,x+=a,等价于,x=x+a,x/=3,等价于,x=x/3,(2)10,种复合赋值运算符,C,语言规定的,10,种复合赋值运算符如下:,复合算术运算符:,+=,-=,*=,/=,%=,复合位运算符:,&=,=,|=,=,例,4.4,输出,复合赋值运算结果。,main(),int,x,y,m;,x=10;y=3;m=24;,m/=x 4;,printf,(“%dn”,m);,printf,(“%fn”,(float)x/y);,x=1;,y,*,=x+2;,printf,(“%d-%dn”,x/y,x%y);,运行结果:,4,3.333333,0-1,m=m/(x 4);,例,4.5,输出多个算术表达式的结果,#,include,main(),int,a,b,c1;,a=5;b=8;,printf,(“a1=%d,a2=%d n,a+b,a+=b);,printf,(“a3=%dn,a);,程序运行结果,:,a1=21,a2=13,a3=13,先,运算,a,b,的,值是,13,,变量,a,的值是,13,再运算,a+b,的值,是,21,4.4 关 系 运 算,1.关系运算符及其优先次序,(1),关系运算符(,6,种关系运算符),(,小于,),(,大于,),=,(,大于或等于,),=,(,等于,),!=,(,不等于,),注意:在语言中,“等于”关系运算符是双等号“=”,而不是单等号“=”(赋值运算符)。,例如:,a=18,该表达式是赋值表达式,a=18,该表达式是关系表达式,(,变量,a,是否等于,18),(2),关系运算符,优先级,与,结合方向,在关系运算符中:,=,4,个优先级相同;,=!=,2,个也相同,,且前,4,个高于后,2,个。,结合方向是“,自左至右,”。,(3),关系运算符与其它运算符,关系运算符的优先级低于算术运算符;,关系运算符的优先级高于赋值运算符,。,3,种运算符优先级从高到低为,:,算术运算符,关系运算符,赋值运算符,2.,关系表达式,(,1),关系表达式,关系表达式,是指,用关系运算符将两个表达式连接起来,进行关系运算的式子。,例如,下面的关系表达式都是合法的:,ab,,a+bc-d,,(a=3)=b,,(ab)=(bc),(,2),关系表达式的值,语言中没有逻辑型数据。在语言中:,当关系表达式表示的含意为“逻辑真”,其值为,1,;,当关系表达式表示的含意为“逻辑假”,其值为,。,例如,假设,n1=3,n2=4,n3=5,,则:,n1n2,表达式的值:,0,。,(,n1n2)!=n3,表达式的值:,1,。,n1n2n3,表达式的值:,1,。,思考,:任意改变,n1,或,n2,的值,会影响整个表达式的值吗?为什么?,再次强调:,C,语言用整数“,1,”表示“逻辑真”,用整数“,0,”表示“逻辑假”。,(,3),关系表达式的值,还可以参与其它种类的运算,,例如算术运算、逻辑运算等。,(,n1n2)+n3,表达式的值:,6,因为,n1=1,n=0)&(x31,表达式的值:,1,(,x5),表达式的值:,0,判断一个年份是否是闰年的逻辑表达式:,(,year%4,=,0),&,(year%100,!=,0),(year%400=0),例如:,判断,1900,年是否是闰年:,先求表达式,year%4,=,0,的值得,1,再求表达式,year%100,!=,0,的值得,0,逻辑表达式,(,year%4,=,0),&,(year%100,!=,0),的值得,0,还要求表达式,year%400=0,的值得,0,最后求值整个表达式的值得,0,1900,年不是闰年,6,说明,(,1,)逻辑运算符两侧的,操作数,,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。,例如:,float a,b;,a=25.28;b=52.78;,!,a,表达式的值:,0,!,(,A,),表达式的值:,0,a11.564,&,b31,表达式的值:,1,(,b5),表达式的值:,1,(,2,)在计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式,即,并不是所有的表达式都被求解。,1,)逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。,2,)逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。,例如:设,n1=6,n2=9,x=2,y=2,求解表达式,(,x=n1n2)&(y=n2n1),后,,x,的值 为:,,y,的值不变,仍等于,2,求解表达式,(,x=n1n2),(y=n2n1),后,,x,的值 为:,,y,的值为:,1,例,4.6,复杂表达式的计算顺序,#,include,main(),int,a=10,b=15,c=14,temp;,temp=,a+6b&b-cc,;/*,*/,printf,(a+6b&b,-cc,=%dn,temp);,temp=,!a+b,*,c-b/a&b-a,*,!(c-a),;/*,*/,printf,(!a+b*c-b/a,4.6 自 增 自 减 运 算,1.,自增(,+,)、自减(,-,)运算,自增运算使单个变量的值增,,自减运算使单个变量的值减。,2.,用法与运算规则,(,1,),前置运算运算符放在变量之前:变量、变量,先使变量的值增(或减),然后再以变化后的值参与其它运算,即,先增、减,后运算,。,(,2,),后置运算运算符放在变量之后:变量、变量,变量先参与其它运算,然后再使变量的值增(或减),即,先运算,后增、减,。,(,3,),结合方向:右左,3.,自增、自减运算说明,(,1,),自增、自减运算符,不能用于常量和表达式。,例如,,5+,、,-(,a+b),等都是非法,的。,(,2,),自增、自减运算,常用于循环语句中,使循环控制变量加(或减),以及指针变量中,使指针指向下(或上)一个地址。,(,3,),在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。,例如:,a+a+a+b,例,4.7,求下列表达式的值,设,int,a,b;,a=3;b=4;,(1),+,a+b+,变量,a:4 ,表达式值:,8,变量,b:5,(2),a+a+a,等价于,(,a+)+(a+)+a,表达式值:,9 ,变量,a:5,(3),a+(+a)+(+a),变量,a:5,表达式值,:,15,例,4.8,自增自减运算符的用法与运算规则示例,main(),int,x=6,y;,printf,(x=%dn,x);/,*,输出,x,的初值,*,/,y=+x;/,*,前置运算,*,/,printf,(y=+x:x=%d,y=%dn,x,y);,y=x-;/,*,后置运算,*,/,printf,(y=x-:x=%d,y=%dn,x,y);,程序运行结果,:,x=6,y=+x:x=7,y=7,y=x-:x=6,y=7,例,4.9,由自增自减组成的表达式,#,include,main(),int,a;float x;,a=16;x=12.6;,printf,(a1=%d,a2=%d,a3=%dn,a+,a+,a+);,printf,(a=%dn,a);,printf,(x1=%f,x2=%f,x3=%fn,-x,-x,-x);,程序运行结果,:,a1=18,a2=17,a3=16,a=19,x1=9.600000,x2=10.600000,x3=11.600000,例,4.10,由自增自减组成的表达式,main(),int,a,b;float x,y;,a=16;x=12.6;+a;+x;,printf,(1-a=%d,x=%fn,a,x);,a+;x+;,printf,(2-a=%d,x=%fn,a,x);,b=a+;y=x+;,printf,(3-b=%d,y=%fn,b,y);,printf,(4-a=%d,x=%fn,a,x);,程序运行结果,:,1-,a=17,x=13.600000,2-a=18,x=14.600000,3-b=18,y=14.600000,4-a=19,x=15.600000,1.,条件运算符:,?,:,2,条件表达式一般格式:,表达式,1,?,表达式,2,:,表达式,3,条件表达式中的“表达式,1,”、“表达式,2,”、“表达式,3,”的类型,可以各不相同。,int,x,y,a,b;,char c;,x=56;y=34;a=23;b=32;,xy,?,C=#,:,(a+b),4.7,其 它 运 算,3,条件运算规则,:,如果“表达式,1,”的值为非,0,值,(,即逻辑真,),,运算结果等于“表达式,2,”的值;否则,运算结果等于“表达式,3,”的值。,4,条件运算符优先级与结合性,条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。,其,结合性为“从右到左”,。,例如:,xy,?,x+y,:,ab,?,a,*,b,:,a+b,等价于,:,xy,?,x+y,:,(,ab,?,a,-,b,:,a+b,),设,x=5 y=8 a=34 b=12,表达式的,值:,22,例4.11从键盘上输入一个字符,如果它是大写字母,则把它转换成小写字母输出;否则,直接输出。,main(),char,ch,;,printf,(Input a character:);,scanf,(%c,&,ch,);,ch,=(,ch,=A&,ch,=Z)?(,ch,+32):,ch,;,printf,(,ch,=%cn,ch,);,4.,逗号运算符,(,,,),及其表达式,c,语言提供一种用逗号运算符“,,,”连接起来的式子,称为逗号表达式。,逗号运算符又称顺序求值运算符。,(1),一般形式,表达式,表达式,表达式,n,(2),求解过程,自左至右,依次,计算各表达式的值,最后一个表达式的值即为整个逗号表达式的值。,(1),逗号表达式,:,a=3,*,5,a,*,4,的值,先求解,a=3,*,5,,,得,a=15,;,再求,a,*,4=60,,,所以逗号表达式的值为:,60,。,(2),逗号表达式,(,a=3,*,5,a,*,4),a+5,的值,先求解,a=3,*,5,,,得,a=15,;,再求,a,*,4=60,;,最后求解,a+5=20,,,所以逗号表达式的值为:,20,。,注意:并不是任何地方出现的逗号,都是逗号运算符。很多情况下,,逗号仅用作分隔符,。例如:,int,a,b,c;,printf,(“%d%dn”,a+b,b+3);,6.,求字节数运算符,(1),运算符,:,sizeof,求字节数运算符与算术运算符的表示形式不同,它是由字母组成的。,(2),求字节数表达式的格式:,sizeof,变量名,该表达式求出变量所占内存存储单元的字节个数,结果是一个正整型数。,sizeof,(,数据类型名,),该表达式求出指定数据类型所需内存存储单元的字节个数,结果是一个正整型数。,例如:设,char a1;,sizeof,a1,表达式的值,:1,sizeof,(,int,),表达式的值,:2,同学们再见,
展开阅读全文