资源描述
Click to edit Master title style,Click to edit Master text styles,Second Level,Third Level,Fourth Level,Fifth Level,运算符和表达式,夏涛,运算符与表达式,计算机与运算密不可分。运算是对数据的加工。,最基本的运算形式常常可以用一些简洁的符号记述,这些符号称为运算符或操作符。,C,表达式:用运算符将运算对象(也称操作数)连接起来的、符合,C,语法规则的式子。被运算的对象,-,数据称为运算量或操作数。运算量可以是数字,也可以是字符;运算量可以是常量,也可以是变量,还可以是函数。,表达式描述了对哪些数据,以什么顺序施与什么样的操作。它由运算符与运算量组成。,2+3,运算量,运算量,运算符,合法的表达式:,1,、,a+3,2,、,1.25+sin(90),3,、,ac,4,、,a=1998,与代数运算符、代数表达式的差异,1,、,不是所有的代数运算符都被,C,语言支持。,2,、同样一个功能的运算符的书写形式是有差异的。,3,、有些代数运算符需要通过函数实现。,4,、有些运算符在普通代数式中是没有的。,5,、,C,语言表达式和代数表达式的书写格式是有差异的。,6,、不要吝啬使用括号。,与,运算,运 算:,对数据进行计算处理的过程。,例:,y,=,x,*,x,、,y,=,cos(,x,),、,a,b,。,运算符,:,表示不同运算的符号(它代表各种运算的含义)。,例:,+,、,-,、*、,、,b,。,运算符,种类,算术运算符、关系运算符、逻辑运算符、条件运算符等。,优先级,混合运算时,各种运算的优先次序。,结合性,混合运算时,各种运算是从运算符左边还是右边开始进行。,运算与运算符,运算符号,注意,1,、运算符的功能,2,、与运算量的关系,A,、,要求运算量的个数:要求两个运算量参加运算,称为双项(双元、双目)运算符;有的运算符只允许有一个运算量,称为单项(一元、一目)运算符。,B,、,要求运算量的类型。,3,、运算的优先级别,4,、结合方向,5,、所得结果的类型,即表达式的类型。,%:,只能对整数进行该运算,/:,整数运算的结果为整数,运算符的优先级与结合性,运算符的优先级:运算符优先级表,按照由高向低的次序执行;,运算符的结合性:算术运算符的结合方向。,“,自左至右,”,或,“,自右至左,”,。,例如:,=,是,“,自右至左,”,结合的;,a=b=c=5,就相当于,a=(b=(c=5);,运算的优先级,今后再讲,基本运算符与基本表达式,1,、算术运算符与算术表达式,2,、关系运算符与关系表达式,3,、逻辑运算符与逻辑表达式,4,、赋值运算符与赋值表达式,基本的算术运算符,+,加法运算符,-,减法运算符,*乘法运算符,/,除法运算符,%,模运算符(求余运算符),注意:,1,、两个整数相除的结果为整数,舍弃小数部分;,2,、除数和被除数中有一个为实数,则商为,double,型,思考:,int,a=3;float b=2.5;,那么,a/b,的,结果为何不是,float,型?,3,、求余运算要求,%,的两侧均为整型数据。,百钱买百鸡,main(),int,cocks,hens,chicks;,cocks=0;,while(cocks=19),hens=0;,while(hens=33),chicks=100-cocks-hens;,if(5*cocks+3*hens+chicks/3)=100),printf(“%d,%d%dn”,cocks,hens,chicks);,hens=hens+1;,cocks=cocks+1;,两整数相除,商取整数,例题,分析程序及输出结果,:,main(),char c1=A,c2;,int,m;,c2=c1+32;,m=c1+32;,printf,(c1 c2 m=,%c%c%c,n,c1,c2,m,);,printf,(c1 c2 m=,%d%d%d,n,c1,c2,m,);,有错误吗,?,运行结果,:,运行程序,(2-0.c),c1 c2 m=A a a,c1 c2 m=65 97 97,将字符,A,的,ASCII,代码,(65),存入字符变量,c1,中,!,字符变量,c2,和整变量,m,保存的都是,97,此代码对应的是字母,a!,注意,:,字符型与整型“,通用”,%c,描述字符型,;,%d,描述整型,自增、自减运算符,注意:,1,、,只能用于变量,不能用于常量或表达式;,2,、运算符的结合方向,为“,自右至左,”,。,使变量的值增,1,或减,1,。,名 称 运算符 说 明 例,增,1,(前缀),+,先加,1,,后使用。,+i,增,1,(后缀),+,先使用,后加,1,。,i+,减,1,(前缀),-,先减,1,,后使用。,-i,减,1,(后缀),-,先使用,后减,1,。,i-,例:,int,j,,,i=3;,例:,int,j,,,i=3;,j=+i;j=i+;,结果变量,j,的值为,3,,,结果,j,的值为,4,。变量,i,将,3,赋给,j,后自加,1,变为,4,。,赋值运算符,先计算等号右边的表达式,然后将其值赋给等号左边的变量。,C,语言赋值运算符与数学中的等号其含义有着本质的不同。,名 称 赋值运算符,赋 值,=,格式:变量,=,表达式;,例:,x=10;,y=x*x+x;,复合的赋值运算符,1,、复合的赋值运算符:在赋值符,“,=,”,之前加上其它运算符,则构成了复合的运算符。,2,、,C,语言规定可以使用,10,种复合赋值运算符:,+=,,,-=,,*,=,,,/=,,,%=,,,=,,,&=,,,=,,,|=,3,、复合赋值运算符相当于将运算符左侧的变量与右侧的常量(或表达式的值)进行相关的运算。,加赋值,+=a+=b a=a+b,减赋值,-=a-=b a=a-b,乘赋值 *,=a*=b a=a*b,除赋值,/=a/=b a=a/b,模赋值,%=a%=b a=a%b,赋值表达式,1,、由一个赋值运算符将一个变量和一个表达式连接起来的式子称为,“,赋值,表达式”,。,2,、作用:将赋值运算符右侧的,“,表达式,”,的值赋给左侧的变量。,3,、上述的,“表达式”,可以是一个赋值表达式。,4,、赋值的对象,或者说赋值运算符的左边,必须是一个变量,而不能是一个函数或常量。,变量初始化,在说明变量时给它赋一个初值,只需在变量名后面加一等号及一个常数。这就叫做变量初始化。,它的一般形式是:,类型 变量名,=,常数;,注意:,没有赋初值的变量,并不意味着该变量中没有数值。,全程变量在没有明确初始化的情况下由程序自动赋零。,局部变量在未初始化时其值是不确定的,,是一个随机数,。,例:,int,a=3;,int,b=c=0;,float f=5.8;,char c1=e;,变量的赋值,1,、,初始化:说明的同时赋值,int,i=5,j=6;,float x=10.1;,char name=A;,2,、,先,说明,后赋值,int,i;,float x=10.1;,char name;,i=5;,name=A,赋值运算符的副作用,1,、费解、容易误解,-,对人的副作用,克服方法:尽量把程序写得易懂一些。效率和易读性是一对主要矛盾。可靠性第一,效率第二。,措施:将费解处分解;加一些,“,不,必要”,的括号;加注释说明。,2,、不定解,-,对机器的副作用,原因:,C,语言中运算符类型丰富,对表达式的求值顺序无统一规定。同一程序,在不同的计算机系统运行时结果不同。,措施:使表达式分解,在任何计算机上运行都能得到同一结果。,c=b*=a+2;,x=i+j;,a=a+2;b=b*a;c=b;,或:,c=a+2;c=b*c;,或:,c=b*=(a+2);,或:,c=b*=a+2;/*c=a+2;c=b*c*/,x=i+j;i+;,j=3;,i=(k=j+1)+(j=5);,j=3;k=j+1;j=5;i=k+j;,变量的数据类型,、,字节长度、位数、数据范围,数据存储格式,double,float,long,short,char,符,点,表,示,定,点,表,示,不同类型数据间的转换,1,、提升与降格,2,、实数变整数,截去小数;,double,变,float,,,去掉多余的有效数字,四舍五入。,3,、丢失精度:由,2,引起,或由于有效数字位数引起。,4,、结果不确定:符点数降格,当数据值超过了目标类型的取值范围,所得到的结果是不确定的。,5,、截去高位:长整数转换为短整数时,要将高位截去,只将低字节的内容保留。,指出下边程序在执行过程中各个变量的取值。,main(),int,x=315;,char,ch,=a,c;,float f=3.5;,c=x;,x=f;,f=c;,f=x;,315,的二进制形式为:,0000000100111011,其赋给字符变量,c,取低八位即,00111011,所以,c,的值为,:59,。,x,的值为,:3,。,f,的值为,:59.0,。,f,的值为,:3.0,。,不同类型数据间的转换,main(),double a=123456.789098765;,float b=a;,long c=a;,int,i=a;,printf(“a,=%lf,b=%f;c=%ld,i=%dn”,a,b,c,i);,运行结果:,a=123456.789099,b=123456.789062,c=123456,i=-7616,各类型数据间的混合运算,整型、实型、字符型数据间可以混合运算。,不同类型的数据要先转换成同一类型,然后进行运算。,转换的基本原则:,保证运算精度!,必定的转换:,1,、,float,变,double,2,、,char,short,变,int,运算,对象为不同类型时的转换:,1,、,转换方法:,int,unsigned long double,2,、,系统自动进行。,赋值中的类型转换,1,、类型转换是指不同类型变量混合使用的情况。,2,、规则:赋值运算符右边的值变为赋值运算符左边变量所属的类型,3,、整型转换为实行和实型转换为双精度实型,并不增加任何准确度和精确度,4,、普通类型转换的结果,强制类型转换,通过使用强制类型转换,可以强迫表达式的值转换为某一特定类型。一般的形式是:,(类型)表达式,其中类型是,C,语言的标准数据类型。,注意:强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。,逗号运算符,逗号运算符用于将多个表达式串在一起。,逗号运算符是所有运算符中级别最低的。,逗号运算符的左边总是不返回的,也就是说逗号右边表达式的值才是整个表达式的值。,实质:逗号使一系列的运算逐个进行。,逗号用在赋值语句的右边,将一系列表达式逐个分隔开,而赋给变量的值是最后一个表达式的值。,逗号运算符和普通英语中的,and,一词有相同的含义,就象词组,“,do this and this and this,”,一样。,请注意区分参数间的分隔符和逗号运算符。,逗号表达式,用逗号运算符将两个表达式连接起来,称为逗号表达式。逗号表达式的一般形式为:,表达式,1,,表达式,2,,,.,,表达式,n,一个逗号表达式可以与另外一个表达式组成一个新的逗号表达式。,例如:,y=10;,x=(y=y-5,25/y);,Y,的初始值为10,减5后为5,再将25除以5所得结果为5,,所以,x,的值为5。,
展开阅读全文