《C04算术运算符与算术表达式.ppt》由会员分享,可在线阅读,更多相关《C04算术运算符与算术表达式.ppt(45页珍藏版)》请在三一办公上搜索。
1、1,C语言程序设计,School of SoftwareZhengzhou University Students:Frosh Semester:Spring of 2011 Instructor:Song Wei Office:Room 315,Building 18,2,第4章 算术运算符与算术表达式,3,主要内容,算术运算符的概念、分类,优先级,结合方向表达式的概念赋值表达式算术表达式,4,学习内容,运算符是一个符号,告知编译程序执行相应的算术或逻辑运算等C语言有丰富的运算符,例如,算术运算符、逻辑运算符和关系运算符等运算符、常量和变量是表达式的要素,表达式是这些要素的有效组合,绝大多数
2、表达式的书写遵循数学习惯,较易理解通过运算可得到表达式的值,当一个表达式是复杂表达式时,应将其中子表达式的值作为对象进行后面的运算重点:算术运算符与算术表达式。,5,运算符与表达式,表达式是数据间运算关系的表达形式,由运算对象和运算符按一定规则组成。,运算对象:常量、变量、函数运算符:算术、关系、逻辑、位、赋值,单个常量、变量、函数也是表达式,6,C的运算符,运算符是一个符号,其作用是告知编译程序将进行相应的运算。C语言有丰富的运算符,包括算术运算符、逻辑运算符和关系运算符等34个运算符。运算符、常量和变量是表达式的基本要素。大多数表达式书写时符合数学习惯。通过运算可得到表达式的值,当一个表达
3、式是复杂表达式时,应将其中子表达式的值作为参数进行后余的运算。,7,语言运算符,8,运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型,学习运算符应注意,9,3.1 算术运算符,C语言中有如下五种算术运算符,共表示6种运算。+(加法运算符,或正值运算符)-(减法运算符,或负值运算符)*(乘法运算符)/(除法运算符)%(模运算符)负值运算符只需要一个数据对象参加运算,称为一元运算符。加、减、乘、除、模运算符,需要两个数据对象参加运算,称为二元运算符。,10,注 意,算术运算符的使用和数学中运算符的使用基本一致但也有一些用法有别于数学习惯(1)C语言中不能用数学中的
4、符号“”或“”表示乘法。另外,C语言中两个数据相乘,“*”也不能省略8*m不能写成8m、8m或8m(2)不能用符号“”或分数线表示除法(键盘上没有),11,注 意,(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
5、,15.6%2.3都是错误的,2/3=?,12,2.算术运算符的优先级,不同的算术运算符具有不同的求解顺序,即优先级,正号和负号运算的优先级最高然后是乘、除和求模运算最后是加减运算圆括号可用来提高运算符的优先级中括号“”和大括号“”不用来改变运算符号的优先级,另有它用若一个运算式子中,包含两个相同优先级的运算符时,运算符的求解顺序决定于其结合方向。算术运算符的结合方向都是自左至右的。,13,C语言中算术运算符的优先级及结合方向,14,3.2 算术表达式,按照C语言规则,将算术运算符、圆括号及运算对象(常量、变量、函数等)连接起来的式子,称为算术表达式 算术表达式的构成数学问题的表达式描述标准数
6、学函数的使用,15,1.算术表达式的构成,C语言的算术表达式是由运算对象(常量、变量、函数等)、和至少0个运算符及圆括号之间的组合所组成的式子。组成C语言的表达式采用递归方式定义。单独的一个常数或者一个变量是表达式,称为原子表达式。例如,“3”“x”都是原子表达式。用运算符将表达式连接起来的有效式子是表达式。例如,“3+4”“x=5”“x=5+7”都是表达式。用圆括号括起来的表达式也是表达式。例如,“(x+4)”“(x=6)”都是表达式。所有的表达式都是经过有限次使用规则(1)(2)(3)得到的式子。,16,1+2(1*2)/xsin(a)+cos(b)(-b+sqrt(b*b-4*a*c)/
7、(2*a),17,(1*2)/x,由常量 1,2;变量 x;运算符*,/;以及一对圆括号构成其中单独的常量或变量 1,2,x 也可视作基本的表达式组合 1*2,(1*2)也是表达式,18,表达式的分类,若一个表达式不是原子表达式,则称为复合表达式。根据最后一次运算的不同,也可以将表达式分为不同的表达式。最后一次运算是赋值运算的表达式,称为赋值表达式。最后一次运算是算术运算的表达式,称为算术表达式。例如:x=3+5y=(3+5)都为赋值表达式。3+45*7+43/465*65+(x=3)都为算术表达式。,19,子表达式,如果表达式 a 是表达式 b 的组成部分,则表达式 a 称为表达式 b 的子
8、表达式一般地,一个表达式可以由若干个子表达式的基本表达式组成,20,注 意,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”的含义是
9、“m的值与10相加的结果”,即表达式的结果为11,21,基本算术运算符:+-*/%结合方向:从左向右优先级:-*/%-+-说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据,例 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,22,2.数学问题的表达式描述,在程序设计时,需要把一个数学问题用C语言表达式的形式描述
10、出来设有变量说明 int m,n,x,y;(1)求m和n的和,用C语言表达式可以描述为 m+n(2)求整数m的个位数字,表达式可以描述为 m%10(3)有数学公式 y=x2-11x 2输入x的值,求y值,用C语言表达式可以描述为 y=x*x-11*x-2,23,【例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;,24,3.标准数学函数的使用,C语言提供了标准函数库,包含了许多常用的数学函数。用C语言表
11、达式描述复杂的数学算式时,常常要使用到一些标准数学函数 有关数学计算的标准库函数,参见附录B。int abs(int x);double cos(double x);double exp(double x);,25,【例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;,程序的运行结果为:,26,【例】设y=(lg|x|-ln(x1/2)/4。当x的值为3.
12、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;,27,4.3 类 型 转 换,C语言允许不同类型的值进行混合运算,例如:整型数据(包括int,long,以及字符型数据等)和实型数据(包括float,double)可以混合运算但不同类型的数据进行混合运算时,需要进行类型转换。转换的方式有两种自动转换(也称为隐式转换)强制类型转换(也称为显式转换),28,隐
13、式转换(自动转换)什么情况下发生赋值转换-把一个值赋给与其类型不同的变量时运算转换-不同类型数据混合运算时输出转换-输出时转换成指定的输出格式函数调用转换-实参与形参类型不一致时转换运算转换规则:不同类型数据运算时先自动转换成同一类型,不同类型数据间的转换,29,(1)赋值转换,如果赋值运算符两边的数据类型不同,系统将进行自动转换。赋值运算符右边表达式的类型转换成赋值运算符左边变量的类型,然后赋值。赋值转换规则:实型值赋给整型变量时,舍去小数部分;整型值赋给实型变量时,增加小数部分(小数点后的部分全为0);字符赋给整型变量时,将字符的ASCII码值赋给整型变量关于赋值还有更多的转换规则,详见第
14、13章。,30,(2)运算转换,当不同类型的值在同一表达式中进行混合运算时,它们将自动转换成同一类型,然后进行运算。转换工作由编译系统自动完成。自动转换遵循一些规则,如图所示。,图中横向箭头的含义是:实型数都是按双精度进行的。也就是说,即使两个float类型的变量进行运算时,也是先转换成double型,然后进行运算。,31,混合运算类型转换规则,如果一个运算符两边的运算对象类型不同,先要将运算对象转换为相同的类型,然后再参加运算规则:较低类型转换为较高类型加法算式“1+2.2”,以数学规则进行运算时,需将加法运算符左侧的整数1转换为小数1.0后,再与加法运算符右侧的小数2.2进行加法运算,得到
15、小数3.2C语言中对混合运算的规定和数学习惯近似,但由于数据类型定义更加具体,故其转换规则比较复杂,32,混合运算类型转换规则,横向箭头表示必须的转换;纵向箭头表示当运算符两边的运算数为不同类型时的转换,33,【例4.3】类型转换。,#include int main()int num1=3;long num2=4;printf(result=%ldn,num1+num2);return 0;,程序的运行结果为:,34,转换说明,不同数据类型的表达式进行运算,转换按照数据长度(该类型数据占用存储单元的字节数)增加的方向进行。即按“向高看齐”的原则,提升“较低”的类型,从而保证精度不被降低。转换
16、是一步到位的转换。例4.3中,int型和long型数据进行混合运算时,并非先把int型转换为unsigned型,再把unsigned型转换为long型,而是直接把int型转换为long型。类型转换:数据按照转换后的类型参加运算,但运算过程并不会改变数据本身的类型。例4.3中,计算表达式“num1+num”,并没有改变num1的类型。即求和后,num1的类型仍然是int型的。,35,例【4.4】已知:char ch=A;int m=5;float f=2.0;double d=2.5;long L=10;表达式ch+m-f*d/L的运算过程,如图所示。,36,2.强制转换类型,C语言也提供了以显
17、式的形式强制转换类型的机制,程序设计者通过类型说明符的说明,强制某一数据按指定类型参加运算。其一般形式为(类型说明符)表达式其效果是把表达式的类型强制转换为要求的类型。强制类型转换时,必须使用一组圆括号,括住欲转向的类型说明符。要转换类型的表达式一般也加圆括号。但如果要转换类型的表达式是原子表达式时,可以不加圆括号。例如:(double)a/*将a转换成double型*/(int)(x+y)/*将“x+y”的计算结果转换为int型*/(int)x+y/*仅将x转换为int型,再与y相加*/强制类型转换和自动转换一样,并不改变原表达式本身的值与类型,只是通过对原来表达式强制转换,得到一个新类型的
18、数据而已。,37,一般形式:(类型名)(表达式)例:(int)(x+y)(int)x+y(double)(3/2)(int)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,精度损失问题,显式转换(强制转换),说明:强制转换得到所需类型的中间变量,原变量类型不变,38,【例4.5】计算求表达式(int)(6.5/4)的值。,先计算6.5/4的值。int型的数值4自动转换为double型的值4.0参与运算,结果为double型的值1.625;再将double型的数值1.625强制转
19、换为int型,在转换时小数部分被截去,结果为1。注意:强制类型转换,并不改变原表达式本身的值与类型。例4.5中,表达式“6.5/4”本身的值始终为“1.625”,其类型类型也始终为实型。,39,【例】求表达式(int)(3.0/2)的值,先求解3.0/2,int型的数值2自动转换为double型的数值2.0参与运算,结果为double型的数值1.5再将double型的数值1.5强制转换为int型,由于int型不含小数,因而在转换时小数部分被截去,结果为1但在强制类型转换前后,表达式“3.0/2”本身的值均为“1.5”,40,【例4.6】整型数据和实型数据的强制类型转换。,#include in
20、t main()int num1=42;float num2=53.6;printf(num1=%d,(float)num1=%fn,num1,(float)num1);printf(num2=%f,(int)num2=%dn,num2,(int)num2);return 0;,注意:运行结果中num1和num2本身的值并未发生变化,即表达式“(float)num1”和表达式“num1”是不同的。,41,【例】整型数据和实型数据的强制类型转换,#include int main()int m=1;float n=2.2;printf(“m=%d,(float)m=%fn“,m,(float)m
21、);printf(n=%f,(int)n=%dn,n,(int)n);return 0;,m=1,(float)m=1.000000n=2.200000,(int)n=2,42,注意:在许多场合,强制转换是必须的如,用标准数学函数 sqrt 求一个整数 m 的平方根,sqrt 要求一个 double 型参数,如果直接用int 型 m 则可能得不到正确的结果,因此必须强制转换 m 为 double 型,写成 sqrt(double)(m)隐式,43,类型转换,1)隐式(自动)类型转换 看一个表达式计值的简单例子:85+c+3.4-765.83*a 85+(c99)(184184.0)+3.418
22、7.4-765.83*(a97.0)187.4-74285.51-74098.1185+c+3.4-765.83*(a97.0)85+c+3.4-74285.51 85+(c99)+3.4-74285.51(184184.0)+3.4-74098.11 187.4-74285.51-74098.112)显式(强制)类型转换 其一般格式:(类型)表达式 如:(int)(a+b);(float)(x%3);(double)x,44,总结,运算符的概念,优先级,结合方向算术运算符使用表达式的的应用赋值表达式的使用算术表达式的使用表达式中只能用小括号只能使用C规定的运算符,不能想当然使用,45,Any Question?Thanks For Coming!,