资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第,4,讲,算术运算符、表达式,赋值运算与逗号运算,整型变量,占字节数随机器不同而不同,一般占,2,个字节。,shortintlong,。,可用,sizeof,(,类型标识符)测量,。,实型变量,float,:,占4字节,提供7位有效数字,double,:,占8字节,提供15,16位有效数字,字符型变量,字符变量存放字符,ASCII,码,char,与,int,数据间可进行算术运算,复习,2,2.6,算术运算符,1.,基本算术运算符有:,、,、,*、,/,、,%,注意事项,两个整型数据相除的结果只能为整型数值,如,7,2,的结果为,3,“,+,”,或,“,-,”,用作单目运算符时只能有一个运算量,如,x=-5,,,则,+x,的值还是,-5,,而,-x,的值为,+5,。,求余运算只能在两个整型数据之间进行,如,9%5,的值为,4,,而,9.5%3,为非法的运算,当运算量为负数时,所得结果的符号未作明确的规定。,TURBO C,系统规定余数的符号与被除数相同。,3,2.,算术表达式,用算术运算符和圆括号将函数和运算对象(如常量、变量等)按一定的规则连接起来就可以构成一个算术表达式,如:,(a,b)*c,5.0,、,x*y,2*sin,(,z,),等都是算术表达式,表达式都有一个值,即运算结果。,应该注意表达式中运算符的,优先级,和,结合性,优先级用于决定运算中的运算顺序,即有多个运算符出现时,哪一个先计算,哪一个后计算。,(P34-39),结合性则决定同一优先级的运算符之间的运算顺序,.C,语言有两种结合性即是先左后右还是先右后左。,(P34-39),4,运算符,名称,优先级,结合性,(,),括号,1,(最高),自左至右,下标,指向结构体成员,结构体成员,!,逻辑非,2,自右至左,按位取反,增,1,减,1,&,取地址,*,取内容,+,、,正、负号,(类型),强制类型转换,sizeof,计算类型长度,*,乘,3,自左至右,除,%,求余,加,4,自左至右,减,按位左移,5,自左至右,按位右移,5,大于,6,自左至右,小于,大于或等于,小于或等于,等于,7,自左至右,!,不等于,&,按位与,8,自左至右,按位异或,9,自左至右,按位或,10,自左至右,&,逻辑与,11,自左至右,逻辑或,12,自左至右,?,:,条件运算,13,自右至左,赋值,14,自右至左,*,复合运算,%,&,,,逗号,15,(最低),自左至右,6,关于结合性,所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。不同的运算符将有不同的结合性,(P34P39),7,3.,算术运算中的类型转换,在,C,语言中要求参加运算的,两个运算量是同一数据类型,,而运算结果也是该数据类型。,对数据类型不一致的两个运算量,系统会进行数据类型转换,将其中的一个低级别类型的数据向另一个高级别类型的数据转换(按空间大小和数值范围),然后才进行相应的算术运算,运算的结果为其中高级别类型的数据。,高,double float,long(unsigned long),低,int(unsigned,int,)short,int,、,char,图,2.4,算术运算中的类型转换,8,隐式转换,什么情况下发生,运算转换,-,不同类型数据混合运算时,赋值转换,-,把一个值赋给与其类型不同的变量时,输出转换,-,输出时转换成指定的输出格式,函数调用转换,-,实参与形参类型不一致时转换,运算转换规则,:,不同类型数据运算时先,自动,转换成同一类型,9,double,float,long,unsigned,int,char,short,低,高,说明,:,必定的转换,运算对象类型不同时转换,例,char,ch,;,int,i;,float f;,double d;,ch/i,+f*d -(f+i),int,int,double,double,double,double,double,double,int,int,double,double,double,double,double,double,10+a +i*f -d/l,例,int,i;,float f;,double d;,long l;,10,3.,强制类型转换运算符,当自动类型转换不能达到目的时,可以使用强制类型转换运算符。强制类型转换运算符就是用一对括号括起来的类型名标识符,其一般格式为:,(,类型名标识符,)(,表达式,),例如:假设,x,为,float,类型,则表达式,“,x%3,”,是不合法的,因为,%,运算符要求其两侧的数据都必须是整型数据。可以使用表达式,“,(int)x%3,”,达到求余数的目的,即先将实型变量,x,强制转换为整型值,然后再进行取余运算。,11,显式转换(强制转换),一般形式:,(,类型名,),(,表达式),例,(,int)(x+y,)(,将,x+y,的值转换为整型,),(,int)x+y,(,将,x,的值转换为整型然后与,y,相加,),(double)(3/2)(,将,3/2,的值转换为,double),(int)3.6(,将,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,精度损失问题,较高类型向较低类型转换时可能发生,Ch2_007.c,Ch2_008.c,12,2.7,赋值运算符,与,赋值表达式,变量的值在程序的运行过程中能够发生变化主要是通过对变量进行赋值来完成的。如果在程序中没有赋值操作,则变量的值也就不会发生变化。,1.,赋值运算符,()的作用是把一个数据或表达式的值赋给一个变量。,例如:,x=3,赋值运算符的左边只能是变量,不允许是算术表达式或常量。,例如:,x+1=3,赋值运算符与数学中的等号不同,赋值运算符求解以后能够得到一个运算结果。,13,2.,赋值表达式,由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。,赋值表达式的一般形式为:,变量,=,表达式,例如:,x=3*5,执行过程,:先将赋值运算符右边表达式的值求出来,然后将该值赋给左边的变量,被赋值变量的值就是整个赋值表达式的值。,14,3.,复合的赋值运算符,复合的赋值运算符是在赋值运算符的前面加上其它的运算符组合而成的新运算符。,10,种复合赋值运算符分别是:,*,%,&,!,(,这,5,个与位运算有关,将在第十章介绍),例如:,x+=3,等价于,x=x+3,。,x%=3,等价于,x=x%3,。,注意:这些运算符都是由多个字符组合而成的,其字符之间不允许有空格。,15,a+=3,a=a+3,x*=y+8,x=x*(y+8),x%=3,x=x%3,16,4.,自加、自减运算符,自加(,+,)自减(,-,)运算符的作用是使变量的值自动加(减),1,。,自加、自减运算符是单目运算符。,执行过程,变量在自加自减运算符之前(,k+,或,k-),时,先使用变量的值,然后自加或自减。,如:,k=3;x=5+k+;,结果,x,的值为,8,,,k,的值为,4,。,变量在自加自减运算符之后(,+k,或,-k),时,先自加或自减,然后使用变量的值。,如:,k=3;x=+k+5;,结果,x,的值为,9,,,k,的值为,4,。,注意:,自增自减运算只能针对简单变量而言。,17,例,自增、自减运算符的用法与运算规则示例。,/*,程序功能:自增、自减运算符的用法与运算规则示例*,/,main(),int,x=6,y;,printf(x,=%dn,x);/*,输出,x,的初值*,/,y=+x;/*,前置运算,*,/,printf(y,=+x:x=%d,y=%dn,x,y);,y=x-;/*,后置运算先将,x=7,赋给,y,然后执行,x-1*/,printf(y,=x-:x=%d,y=%dn,x,y);,程序运行结果:,x=6,y=+x:x=7,y=7,y=x-:x=6,y=7,18,5.,赋值运算中的类型转换,系统自动将赋值运算符右边的数据类型转换成赋值运算符左边变量的类型。,1.,将实型数据转换为整型值时直接舍弃实数的小数部分。,若其值超出整型值的范围则出错。,2.,将整型值转换为实型值时整数部分取整型值,小数部分的值为零。,3.,将双精度的实型数据转换为单精度的实型数据时截取其小数部分中前面的,7,位有效数字(十进制数),指数部分保持不变。,超值错。,19,赋值运算中的类型转换,(,续,),4.,将整型数据转换为取值范围更大的整型数据时,对于有符号数,用其符号位的值向前扩展。对于无符号数,则用,0,向前扩展。,5.,将整型数据转换为取值范围更小的整型数据时,按所需的位数,从低位直接截取,。超值错。,6,同等长度的整型数据和无符号整型数据之间的转换。,20,2.8,逗号运算符与逗号表达式,逗号运算符,(,,,)又称为顺序求值运算符,由逗号运算符把若干个独立的表达式连接起来构成逗号表达式,逗号表达式的一般形式为:,表达式,1,表达式,2,表达式,3,表达式,n,求值顺序,从左至右,最后一个表达式的值就是整个逗号表达式的值,例如:,x=2,y=x+4,z=x*y,其值为,12,21,第二章 作业,教材,P42,习题二,三、(,1,)、(,2,),22,
展开阅读全文