资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,第,3,章 运算符和表达式,3.1,表达式,3.2,算术运算符,3.3,赋值运算符,3.4,不同数据类型数据间的混合运算,3.5,自增、自减运算符,3.6,逗号运算符,3.7,其它运算符,本章小结,习题参考答案,3.1,表达式,一表达式,表达式是由运算对象、运算符按照,C,语言的语法规则构成的符号序列。表达式可以通过运算产生一个结果或完成某种操作。,C,语言的表达式功能很强,也很复杂,它提供了许多种运算符,3.1,表达式,二运算符,运算符是,C,语言里用于描述对数据进行运算的特殊符号。,C,语言有三大运算符:算术、关系与逻辑、位操作。,3.1,表达式,三运算符和表达式的分类,1,运算符的分类,按在表达式中与运算对象的关系(所需要运算对象的个数)可以分为:,单目运算符,双目运算符,三目运算符,3.1,表达式,按它们在表达式中所起的作用又可以分为:,算术运算符:,+,、,-,、*、,/,、,%,赋值运算符:,=,、,+=,、,-=,、*,=,、,/=,、,%=,、,&=,、,|=,、,=,、,=,自增自减运算符:,+,、,-,关系运算符:,、,、,=,、,=,、,!=,逻辑运算符:,!,、,&,、,|,条件运算符:,?:,位运算符:,、,&,、,、,|,、,逗号运算符: ,,其它运算符:,(),、,、,-,、,.,、,(,类型名,),、*、,&,、,sizeof,3.1,表达式,2,表达式的分类,按照运算符要求运算对象的个数可以分为:,单目表达式,双目表达式,三目表达式,按照运算符在表达式中的作用,可以分为:,算术表达式赋值表达式,自增、自减表达式,关系表达式,逻辑表达式,逗号表达式,3.1,表达式,四优先级和结合性,优先级指同一个表达式中不同运算符进行运算时的优先次序。,结合性是针对同一优先级的多个运算符而言的,它是指同一个表达式中相同优先级的多个运算是自左向右进行运算还是自右向左进行运算。,关于,C,语言运算符的含义、类型、优先级、结合性等问题见附录,B,。,3.2,算术运算符,一,算术运算符,+,:加法运算符,-,:减法运算符,*:乘法运算符,/,:除法运算符,当运算对象均为整数时运算结果也为整数。,%,:求余运算符(模运算符)。,要求,%,两侧运算对象均为整型数据。,算术运算符均为双目运算符,均具有左结合性。*、,/,、,%,的优先级为,3,级,,+,、,-,的优先级为,4,级。,3.2,算术运算符,二算术表达式,算术表达式是用算术运算符和括号将运算对象连接起来的、符合,C,语言的语法规则的式子。,使用算术表达式时应注意:,(1),当双目算术运算符两侧运算对象的类型一致时,运算结果的类型与运算对象的类型相同,如果类型不一致,系统将自动按规律先将运算对象转换为同一类型,然后再进行运算。,(2),可以用括号改变表达式的运算顺序,左右括号必须配对,多层括号都用小括号“()”表示。,(3),注意算术表达式的书写形式,不要写成代数式的形式。,3.3,赋值运算符,一普通赋值运算符,1,赋值运算符,赋值符号“,=”,就是赋值运算符,其功能是将赋值运算符“,=”,右侧表达式的值求出并将结果赋值给“,=”,左侧的变量。,赋值运算符的优先级很低,仅高于逗号运算符,为右结合性。,3.3,赋值运算符,2,赋值表达式,用赋值运算符将一个变量和一个表达式连接起来的符合,C,语言语法的式子称做赋值表达式。,它的一般形式为:,变量名,=,表达式,赋值表达式的结果是赋值号右侧的表达式的值。,求解赋值表达式时,如果赋值运算符两侧的数据类型不一致,赋值时要进行类型转换。转换的原则是将右侧的表达式的值转换为左侧变量的类型再进行对左侧变量赋值。,赋值运算符的使用,#include ,stdio.h,main( ),int,a,b,d,;,char c;,float f1,f2;,a=3;,b=2.3;,d=,a%b,;,c=97;,f1=a/b;,f2=3.0/2.0;,printf(%d,%d,%d,%c,%f,%fn,a,b,d,c,f1,f2 );,3,2,1,a,1.000000,1.500000,3.3,赋值运算符,二复合赋值运算符,在赋值运算符“,=”,之前加上其它一些双目运算符可以构成复合赋值运算符,用于完成运算、赋值组合操作。,C,语言中复合赋值运算符的一般形式为:,运算符,=,其中“运算符”可以是:,+,、,-,、*、,/,、,%,、,|,、,&,、,、,所构成的复合赋值运算符是:,+=,、,-=,、*,=,、,/=,、,%=,、,|=,、,&=,、,=,、,=,所有的赋值运算符包括复合赋值运算符的优先级全部相同,均为右结合性。,3.3,赋值运算符,由复合赋值运算符将一个变量和一个表达式连接起来的式子称为复合赋值表达式。,它的一般形式为:,变量名 复合赋值运算符 表达式,复合赋值表达式的作用等价于:,变量名,=,变量名 运算符,(,表达式,),即先将变量和表达式进行复合赋值运算符所指定的运算,然后将运算结果赋给变量。复合赋值表达式的值就是复合赋值运算符左侧变量被赋值以后的值。,赋值表达式,#include ,stdio.h,main( ),int,a,b,c,d,;,a=3;b=5;c=6;d=8;,c+=b%=a;,d+=d-=b*=b+3;,printf(%d,%d,%d,%dn,a,b,c,d,);,3,10,8,-4,3.4,不同数据类型数据间的混合运算,一自动类型转换,整型、实型、字符型数据间可以混合进行算术运算。进行运算时,参与运算的操作数的数据类型要一致,若参与运算的数据类型不同,先要将其转换为相同的类型,然后再进行运算。,3.4,不同数据类型数据间的混合运算,一自动类型转换,横向箭头表示必须的转换,,,纵向箭头表示当运算符两侧的运算对象为不同类型时的转换,这些转换都是由系统自动进行的,。,高,低,double,long,unsigned,int,char,short,float,自动类型转换,#include ,stdio.h,main( ),int,a=2,b=5;,char c=a;,float x=2.5,y=3.3,z;,z=c/2+x/a-y*b;,printf(%fn,z,);,32.750000,3.4,不同数据类型数据间的混合运算,二强制类型转换,强制类型转换是通过类型转换运算来实现的。,其一般形式为:,(类型说明符)(表达式),(类型说明符)是类型转换运算符,单目运算,优先级别为,2,级,具右结合性。在类型转换运算符的右侧跟上表达式形成类型转换表达式,其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。,3.4,不同数据类型数据间的混合运算,三强制类型转换,赋值表达式的类型转换,当赋值运算符两侧的运算对象数据类型不同时,系统也将进行自动类型转换,转换规则为:将赋值运算符右侧表达式的类型转换为左侧变量的类型。,3.4,不同数据类型数据间的混合运算,1,浮点型与整型相互转换,将浮点数据(包括单、双精度)转换为整型时,将舍弃浮点数的小数部分,只保留整数部分。,2,单、双精度浮点型相互转换,由于,C,语言中的浮点值总是用双精度表示的,所以,float,型数据只是在尾部加,0,延长为,double,型数据参加运算,然后直接赋值。,double,型数据转换为,float,型时,先截取双精度实数的前,7,位有效数字,然后再赋给单精度类型的变量。,3,字符型与整型相互转换,将整型数据赋给字符型变量时,由于整型数据用两个字节存放,而字符型数据用一个字节存放,所以只保留其低,8,位赋给字符型变量,高位部分舍弃。,字符型数据赋给整型变量时,将字符数据的,8,位放入整型变量的低,8,位中,有些编译系统在整型变量的高,8,位补,0,;而有些编译系统(如,Turbo C,),根据字符的最高位为,0,或,1,将高,8,位全部补,0,或补,1,。,3.4,不同数据类型数据间的混合运算,4,整型与长整型相互转换,长整型数据赋值给整型变量时,将低,16,位值送给整型变量,将高,16,位截断舍弃。,将整型数据赋值给长整型变量时,将整型数据的,16,位送到长整型变量的低,16,位中,根据整型数据符号位为,0,或,1,,在长整型的高,16,位全部补,0,或,1,,以保持数值不改变。,5,无符号整数与有符号整数相互转换,若占据同样长度存储单元的有符号、无符号整型相互转换时,是原样赋值,内部的存储方式不变,但外部值可能改变,。,若占据不同长度存储单元的有符号、无符号整型之间转换,先参照,(4),中所述方式进行转换,再按上面字节数相同的方式直接赋值。,强制类型转换,#include ,stdio.h,main( ),int,a=2,b,c;,float x=2.5,y;,b=(,int)x,;,y=(,float)a,;,c=(,int)x%(int)y,;,printf(%d,%fn,b,y,);,printf(%dn,c,);,2,2.000000,0,赋值运算的自动类型转换,#include ,stdio.h,main( ), char c=a;,int,a=321,b,i;,unsigned m=65535,n;,float x=2.5,y;,double d=12345678.987;,printf(c,=%,c,a,=%,d,m,=%,u,x,=%,f,d,=%,fn,c,a,m,x,d,);,c=a;,b=x;,y=a;,x=d;,i=m;,n=-1;,printf(c,=%,c,b,=%,d,y,=%,f,x,=%,f,i,=%,d,n,=%,un,c,b,y,x,i,n,);,c=,a,a,=321,m=65535,x=2.500000,d=12345678.987000,c=,A,b,=2,y=321.000000,x=12345679.000000,i=-1,n=65535,3.5,自增、自减运算符,一自增自减运算符、表达式,+,:自增运算符,使变量的值增加,1,。,-,:自减运算符,使变量的值减少,1,。,自增、自减运算符均为单目运算符,优先级为,2,,具右结合性。,3.5,自增、自减运算符,一自增自减运算符、表达式,自增、自减运算符都有两种用法,:,前置运算,将,+,或,-,运算符置于变量之前,一般形式为:,+,变量、,-,变量,。,其功能是使变量的值增(减),然后再以变化后的变量值参与其它运算,即先增减、后运算。,后置运算,将,+,或,-,运算符置于变量之后,一般形 式为:变量,+,、变量,-,。,其功能是变量先参与其它运算,然后再使变量的值增(减),即先运算、后增减。,自增,、,自减运算符的用法,#include ,stdio.h,main( ),int,a,b,c,d,;,a=3;b=5;,c=,a+;d,=b-;,printf(%d,%dn,c,d,);,printf(%d,%dn,a+,-b,);,3,5,4,3,3.5,自增、自减运算符,二关于自增自减运算符、表达式的说明,自增、自减运算符实际上属于赋值运算符,不能应用于常量和表达式,操作对象只能是变量。,一般自增自减表达式或是以表达式语句的形式出现,或是出现在,for,循环语句中使循环控制变量加(减),或应用于指针变量,使指针指向下(上)一个地址。其它将自增自减表达式应用于另一个表达式内部的形式,在尚未熟练掌握时尽量不去使用。,最好不要使用诸如,i+j,、,(,i+)+(i,+),此类容易产生歧义或错误的形式。,自增,、,自减运算符的特别用法,(1),#include ,stdio.h,main( ),int,i,j,m,n,;,i=5;j=5;,m=(,i+)+(i,+);,n=(+,j)+(+j,);,printf(%d,%dn,m,n,);,printf(%d,%dn,i,j,);,10,14,7,7,3.6,逗号运算符,逗号运算符就是用逗号“,”,作为操作符,它可以把多个表达式连接起来形成逗号表达式。逗号运算符又称顺序求值运算符。,逗号运算符为双目运算,其优先级别是,C,中所有运算符中最低的,具左结合性。,逗号表达式扩展为,n,元运算的形式:,表达式,表达式, ,表达式,n,逗号表达式的求值过程是自左向右,依次计算各子表达式的值,最右侧子表达式“表达式,n”,的值即为整个逗号表达式的值。,逗号运算符,#include ,stdio.h,main( ),int,a,b,i,j,k,;,i=(a=3,3*5);,k=(j=b=5,a+b);,printf(%d,%d,%d,%d,%dn,a,b,i,j,k,);,printf(%dn,5,6);,printf(%dn,(5,6);,3,5,15,5,8,5,6,3.7,其它运算符,sizeof,的使用形式比较像是函数调用,但它是一种运算符。,其一般应用形式为:,sizeof,(,运算对象,),sizeof,运算的功能是求出运算对象在计算机的内存中所占用的字节数。其中运算对象可以是数据类型说明符或表达式,当运算对象是表达式时括号可省略。,sizeof,是单目运算符,优先级别为,2,,具右结合性,运算的结果是整型。,S,izeof,运算符,#include ,stdio.h,main( ),int,a,b,c,d,;,double x=1.23;,a=,sizeof(long,);,b=sizeof(x+3);,c=sizeof(x)+3;,d=sizeof(ab123abcn);,printf(%d,%d,%d,%dn,a,b,c,d,);,4,8,11,10,本章小结,本章主要介绍了运算符与表达式,其中涉及到的重要概念有:运算对象的个数、运算优先级、结合性、类型转换等。运算符是,C,语言里用于描述对数据进行运算的特殊符号。表达式是由运算符连接常量、变量、函数所组成的式子,每个表达式都有一个值和类型。表达式求值按运算符的优先级和结合性所规定的顺序进行。,1,运算符优先级和结合性,一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,而单目运算符、三目运算符、赋值运算符具有右结合性。,本章小结,2,算术运算符,(1),整数相除是做整除,结果也为整数。,(2),求余运算要求运算对象均为整型。,(3),注意运算时的类型转换问题。,(4),注意,C,语言表达式与数学公式在形式上的差异,3,赋值运算符,(1),赋值表达式的左边必须为变量。,(2),复合赋值运算符的优先级全部在同一级别。,(3),注意赋值时的类型转换。,本章小结,4,类型转换,(1),自动转换:在不同类型数据的混合运算中,由系统自动实现转换,由少字节类型向多字节类型转换。,(2),强制转换:由强制转换运算符完成转换。,(3),赋值时的类型转换:不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边变量的类型。,(4),无论是系统所做的自动类型转换还是强制类型转换,都只是将常量、变量、表达式的值进行转换去参与运算,不会改变变量的数据类型和值。,本章小结,5,自增、自减运算符,(1),自增、自减其实也是赋值运算,只能针对变量做自增、自减运算。,(2),注意前置运算(先增减后运算)与后置运算(先运算后增减)对所在表达式的影响的不同,6,逗号运算符,(1),逗号表达式的值取最后一个表达式的值。,(2),逗号运算符的优先级最低。,7,其它运算符,(1) sizeof,是运算符,不是函数名。,(2),sizeof,求表达式在内存中所占的字节数。,
展开阅读全文