资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,C,语言程序设计,School of Software,Zhengzhou,University,Students:Frosh,Semester:Spring of 2011,Instructor:Song,Wei,Office,:,Room 315,,,Building 18,第,4,章 算术运算符与算术表达式,主要内容,算术运算符的概念、分类,优先级,结合方向,表达式的概念,赋值表达式,算术表达式,3,学习内容,运算符是一个符号,告知编译程序执行相应的算术或逻辑运算等,C,语言有丰富的运算符,例如,算术运算符、逻辑运算符和关系运算符等,运算符、常量和变量是表达式的要素,表达式是这些要素的有效组合,绝大多数表达式的书写遵循数学习惯,较易理解,通过运算可得到表达式的值,当一个表达式是复杂表达式时,应将其中子表达式的值作为对象进行后面的运算,重点:算术运算符与算术表达式。,4,运算符与表达式,表达式是数据间运算关系的表达形式,由,运算对象,和,运算符,按一定规则组成。,运算对象:常量、变量、函数,运算符:算术、关系、逻辑、位、赋值,单个常量、变量、函数也是表达式,5,C,的运算符,运算符是一个符号,其作用是告知编译程序将进行相应的运算。,C,语言有丰富的运算符,包括算术运算符、逻辑运算符和关系运算符等,34,个运算符。,运算符、常量和变量是表达式的基本要素。大多数表达式书写时符合数学习惯。,通过运算可得到表达式的值,当一个表达式是复杂表达式时,应将其中子表达式的值作为参数进行后余的运算。,6,C,运,算,符,算术运算符:(,+-*/%+-,),关系运算符:(,=!=,),逻辑运算符:(!,&|,),位运算符 :(,|&,),赋值运算符:(,=,及其扩展),条件运算符:(,?:,),逗号运算符:(,),指针运算符:(*,&,),求字节数 :(,sizeof,),强制类型转换:(类型),分量运算符:(,.-,),下标运算符:(,),其它 :(,()-,),语言运算符,7,运算符功能,与运算量关系,要求运算量个数,要求运算量类型,运算符优先级别,结合方向,结果的类型,学习运算符应注意,8,3.1,算术运算符,C,语言中有如下五种算术运算符,共表示,6,种运算。,+(,加法运算符,或正值运算符,),-(,减法运算符,或负值运算符,),*(,乘法运算符,),/(,除法运算符,),%(,模运算符,),负值运算符只需要一个数据对象参加运算,称为一元运算符。,加、减、乘、除、模运算符,需要两个数据对象参加运算,称为二元运算符。,9,注 意,算术运算符的使用和数学中运算符的使用基本一致,但也有一些用法有别于数学习惯,(1)C,语言中不能用数学中的符号“,”,或“,”,表示乘法。另外,,C,语言中两个数据相乘,“*”也不能省略,8*m,不能写成,8m,、,8m,或,8m,(2),不能用符号“,”,或分数线表示除法,(,键盘上没有,),10,注 意,(3),当除数和被除数都是整数时,其商也是整数,(取整,而非四舍五入),5/3,结果为,1,,,2/3,的结果为,0,(4),如果除数和被除数中,至少有一个是实型数时,其商也是实型数,并按一定精度要求,对某些位四舍五入。,例如,,5.4/2,的结果为,2.7,,,6/3.0,的结果为,2.0,,,2.0/3.0,的结果为,0.666667,。,(5),符号“,%”,表示求模运算,即两个整数相除的余数。求模运算只能用于两个整数之间,5%3,结果为,22%3,结果为,25.3%4,,,12%3.4,,,15.6%2.3,都是错误的,2/3=,?,11,2.,算术运算符的优先级,不同的算术运算符具有不同的求解顺序,即优先级,正号和负号运算的优先级最高,然后是乘、除和求模运算,最后是加减运算,圆括号可用来提高运算符的优先级,中括号“,”,和大括号“,”,不用来改变运算符号的优先级,另有它用,若一个运算式子中,包含两个相同优先级的运算符时,运算符的求解顺序决定于其结合方向。,算术运算符的结合方向都是自左至右的。,12,C,语言中算术运算符的优先级及结合方向,算术运算符,功,能,优先级,结合方向,-,负值运算,高,自左至右,*,乘法运算,中,自左至右,/,除法运算,自左至右,%,求余运算,自左至右,+,加法运算,低,自左至右,-,减法运算,自左至右,13,3.2,算术表达式,按照,C,语言规则,将算术运算符、圆括号及运算对象,(,常量、变量、函数等,),连接起来的式子,称为算术表达式,算术表达式的构成,数学问题的表达式描述,标准数学函数的使用,14,1.,算术表达式的构成,C,语言的算术表达式,是,由运算对象,(,常量、变量、函数等,),、,和至少,0,个运算符及,圆括号之间的组合所组成,的式子。,组成,C,语言的表达式采用递归方式定义。,单独的一个常数或者一个变量是表达式,称为,原子表达式,。例如,“,3”“x”,都是原子表达式。,用运算符将表达式连接起来的有效式子是表达式。例如,“,3+4”“x=5”“x=5+7”,都是表达式。,用圆括号括起来的表达式也是表达式。例如,“(,x+4,)”“(,x=6,)”都是表达式。,所有的表达式都是经过有限次使用规则,(1)(2)(3),得到的式子。,15,1+2,(1*2)/x,sin(a)+,cos,(b),(-b+,sqrt(b,*b-4*a*c)/(2*a),16,(1*2)/x,由常量,1,,,2,;变量,x,;运算符*,,/,;以及一对圆括号构成,其中单独的常量或变量,1,,,2,,,x,也可视作基本的表达式,组合,1*2,,,(1*2),也是表达式,17,表达式的分类,若一个表达式不是原子表达式,则称为复合表达式。,根据最后一次运算的不同,也可以将表达式分为不同的表达式。,最后一次运算是赋值运算的表达式,称为赋值表达式。,最后一次运算是算术运算的表达式,称为算术表达式。,例如:,x=3+5,y=(3+5),都为赋值表达式。,3+4,5*7+43/4,65*,65,+(x=3),都为算术表达式。,18,子表达式,如果表达式,a,是表达式,b,的组成部分,则表达式,a,称为表达式,b,的子表达式,一般地,一个表达式可以由若干个子表达式的基本表达式组成,19,注 意,C,语言表达式中的所有字符都是,写在一行上,的,,没有分式,,也,没有上下标,,括号,只有圆括号,一种,(,方括号和花括号作其他用途,),任何一个正确的表达式都应表示,(,或能计算出,),一个值,表达式的类型、值与采用的运算和运算对象的数据类型以及运算对象的值有关。表达式“,3/2”,的类型为整型,值为,1,;表达式“,3.0/2”,的类型为实型,值为,1.5,。,单独的常量或变量也可视作基本的表达式:,1,x,都是表达式,如:表达式“,1+2”,的值为整型数,3,;表达式“,1.0+2”,的值为实型,3.0,如果变量,m,的值是,1,,执行“,m+10”,后,,m,的值并不变成,11,,“,m+10”,的含义是“,m,的值与,10,相加的结果”,即,表达式的结果,为,11,20,基本算术运算符:,+,-,*/%,结合方向:从左向右,优先级:,-,-,*/%,-,+-,说明:,“,-”,可为,单目,运算符时,右结合性,两整数相除,结果为整数,%,要求两侧均为整型数据,例,5/2 =,-5/2.0 =,例,5%2 =,-5%2 =,1%10 =,5%1 =,5.5%2,算术运算符和表达式,2,-2.5,1,-1,1,0,(,),注意,:,两个整数的相除问题,如:,7/4=1 7/8=0,;,若整数中有一个为负,如:,-7/4,这就要视系统的处理而定了,大多数系统,-7/4=-1,;但也有的系统,7/4=-2,21,2.,数学问题的表达式描述,在程序设计时,需要把一个数学问题用,C,语言表达式的形式描述出来,设有变量说明,int,m,,,n,,,x,,,y,;,(1),求,m,和,n,的和,用,C,语言表达式可以描述为,m+n,(2),求整数,m,的个位数字,表达式可以描述为,m%10,(3),有数学公式,y=x,2,-11x 2,输入,x,的值,求,y,值,用,C,语言表达式可以描述为,y=x*x-11*x-2,22,【,例,4.1】,输出整数,x,的个位数、十位数和百位数,#include,int,main(),int,x=563;,printf,(%,d,%d,%d,x%10,(x/10)%10,(x/100)%10),;,/*(x/10)%10,,求十位数*,/,return 0;,23,3.,标准数学函数的使用,C,语言提供了标准函数库,包含了许多常用的数学函数。用,C,语言表达式描述复杂的数学算式时,常常要使用到一些标准数学函数,有关数学计算的标准库函数,参见附录,B,。,int,abs(,int,x);,double,cos,(double x);,double exp(double x);,24,【,例,4.2】,设,y=|x|1/2,。当,x,的值为,5.678,时,计算,y,的值。,#include,#include,/*,使用标准数学库函数需要包含,math.h,头文件*,/,int,main(),double x,y;,x=5.678;,y=,sqrt,(,fabs,(x);,printf,(y=%lfn,y);,return 0;,程序的运行结果为:,25,【,例,】,设,y=(lg|x|-ln(x,1/2,)/4,。当,x,的值为,3.12,时,输出,y,的值,返回,#include,#include,/*,使用标准数学函数需要包含相应的,math.h,头文件*,/,int,main(),double x,y;,x=3.12;,y=1.0/4*(log10(fabs(x)-,log(sqrt(x,);,printf,(,ny,=%f,y);,return 0;,26,4.3,类 型 转 换,C,语言允许不同类型的值进行混合运算,,例如:整型数据,(,包括,int,,,long,,以及字符型数据等,),和实型数据,(,包括,float,,,double),可以混合运算,但不同类型的数据进行混合运算时,需要进行类型转换。,转换的方式有两种,自动转换(也称为隐式转换),强制类型转换(也称为显式转换),27,隐式转换(自动转换),什么情况下发生,赋值转换,-,把一个值赋给与其类型不同的变量时,运算转换,-,不同类型数据混合运算时,输出转换,-,输出时转换成指定的输出格式,函数调用转换,-,实参与形参类型不一致时转换,运算转换规则,:,不同类型数据运算时先,自动,转换成同一类型,不同类型数据间的转换,28,(,1,),赋值转换,如果赋值运算符两边的数据类型不同,系统将进行自动转换。赋值运算符右边表达式的类型转换成赋值运算符左边变量的类型,然后赋值。,赋值转换规则:,实型值赋给整型变量时,舍去小数部分;,整型值赋给实型变量时,增加小数部分(小数点后的部分全为,0,);,字符赋给整型变量时,将字符的,ASCII,码值赋给整型变量,关于赋值还有更多的转换规则,详见第,13,章。,29,(,2,),运算转换,当不同类型的值在同一表达式中进行混合运算时,它们将自动转换成同一类型,然后进行运算。转换工作由编译系统自动完成。自动转换遵循一些规则,如图所示。,图中横向箭头的含义是:实型数都是按双精度进行的。也就是说,即使两个,float,类型的变量进行运算时,也是先转换成,double,型,然后进行运算。,30,混合运算类型转换规则,如果一个运算符两边的运算对象类型不同,先要将运算对象转换为相同的类型,然后再参加运算,规则:,较低类型转换为较高类型,加法算式“,1+2.2”,,以数学规则进行运算时,需将加法运算符左侧的整数,1,转换为小数,1.0,后,再与加法运算符右侧的小数,2.2,进行加法运算,
展开阅读全文