*,第 三 章,挨次构造程序设计,1,程序是对数据进展各种操作,其中运算操作是最根本的操作之一。,在C语言程序中,使用,表达式,描述各种运算。,表达式是由参与运算的数据和表示运算的符号,依据确定的规章组成的式子。,描述运算的符号称为,运算符,,由一个或两个特定符号表示。,引言,2,语言具有丰富的运算符,可分为多种类型,包括:,(1)算术运算符+-*/%,(2)关系运算符 =|,(5)赋值运算符=+=-=*=/=%=等,(6)条件运算符?:,(7)逗号运算符 (,,引言,3,(8)指针运算符*和,(9)求字节数运算符sizeof,(10)强制类型转换运算符(类型),(11)重量运算符 -,(12)下标运算符,(13)其他 如函数调用运算符,引言,4,主要内容,3.1 算术运算和算术表达式,3.2 赋值运算和赋值表达式,3.3 自增自减运算,3.4 优先级和类型转换,3.5 使用数学库函数,3.6 挨次构造程序设计,5,3.1 算术运算和算术表达式,3.1.1 整数算术运算,3.1.2 实数算术运算,3.1.3 混合算术运算,3.1.4 算术表达式,3.1.5 算术表达式的计算规章,6,C语言中的操作,算术运算符,加法运算,+,减法运算,-,乘法运算,*,除法运算,/,取模运算(求余数),%,表3-1 算术运算符,留意,加号+除了可以表示两个数相加外,还表示正号,例如,+5;,减号-除了可以表示两个数相减外,还表示负号,例如-12。,C语言中使用的特殊符号,星号*表示乘号,斜杠/表示除号,百分号%表示求余数。,另外,7,3.1.1 整数算术运算,假设参与运算的操作数都是整数,运算的结果确定是整数。,例如,3+5,5-7,4*3,6/4,7%4,3/5,3%5,%运算符只能用于,整数,运算。,思考:1+1/2的运算结果是多少?,8,-2,12,1,3,0,3,留意,C语言规定,8,3.1.2 实数算术运算,例如,3.4+5.7,4.7*3.2,6.5/4.6,思考:1.0+1.0/2.0的运算结果是多少?,C语言规定,假设参与运算的操作数都是实数,运算的结果确定是实数。,9.1,-2.2,15.04,1.41,留意,实数不能使用运算符%。,9,假设参与运算的操作数一个是整数,另一个是实数,运算的结果确定是实数。,3.1.3 混合算术运算,例如,3+5.7,5.1-7,4.7*3,6/4.6,C语言规定,8.7,-1.9,12.7,1.3,留意,混合运算状况下也不能使用运算符%。,10,3.1.4 算术表达式,由参与算术运算的操作数可以是常量、变量、函数等、算术运算符和圆括号组成的符合C语言语法规章的式子。,概念,留意,C语言中的算数表达式书写形式和代数中的算术表达式类似,但C语言中的算术表达式,必须写成一行,的形式。,例如,代数中的 ,在C语言中必须写成3/5的形式。,代数表达式,C语言表达式,举例,是常数,不行以写成符号,x1+x2+x3+x4/5,b*b-4*a*c,a+b/(c-d),3.1415926,*r*r,a/x+b*y,11,3.1.5 算术表达式的计算规章,假设没有括号,算术表达式依据运算符的优先规章从左到右计算。,假设有括号,括号中的表达式优先级别是最高的,要先计算括号中的表达式。,高级:,*/%,低级:,+-,8-,13/5,+,4*8,-7+,6%3,优先规章,举例1,8-2+32-7+2,33,举例2,8-13/5+4*8-7+6%3,0,7,-5,-1,3,24,17,12,3.2 赋值运算和赋值表达式,3.2.1 赋值运算符,3.2.2 赋值运算的类型转换问题,3.2.3 复合的赋值运算符,3.2.4 赋值表达式,C语言将赋值操作作为一种运算。,13,3.2.1 赋值运算符,一般表达形式,其中,表达式可以是常量、变量、函数等。,例如:,赋值运算过程,a=3,b=sum/30,先计算赋值运算符=右边的表达式的值,然后将计算结果赋给赋值运算符=左边的变量。,例如,sum=3000时,执行b=sum/30,先计算sum/30的值,结果为100,,然后将100赋值给变量b,结果是变量b的值为100。,赋值运算符,=,变量,=,表达式,14,3.2.2 赋值运算的类型转换问题,我们常常会遇到赋值运算符两侧的数据类型不全都的状况,,这时在执行赋值运算时就要进展类型转换。,转换时,以赋值运算符左侧的变量的类型为准进展。,例如:有定义 int a;,float x;,执行 a=45.78时,a的取值是45。,执行x=623时,x的取值是623.000000。,类型转换准则,15,C语言允许将形式为:,变量,=,变量,算术运算符,表达式,的表达式简洁地写成:变量,算术运算符=,表达式,3.2.3 复合的赋值运算符,C语言中的操作,复合赋值运算符,加赋值运算,+=,减赋值运算,-=,乘赋值运算,*=,除赋值运算,/=,取余赋值运算,%=,16,例如:,要求把握的复合赋值运算符:,,*,,a+=1,x-=y+1,a*=b,x/=n+1,x%=10,a=a+1,x=x-,(,y+1,),a=a*b,x=x/,(,n+1,),x=x%10,以下程序的输出结果是_。void main int a=3;printf(“%dn“,(a+=a-=a*a);A-6 B12 C0 D-12,D,举例,17,3.2.4 赋值表达式,由赋值运算符将一个变量和一个表达式连接起来的式子。,例如:“x5+6*a”是一个赋值表达式。假设a=10,则C语言规定,表达式5+6*a的值为65,变量x赋值后的值为65,表达式x5+6*a的值也为65。,例如:x=(y=15),其中赋值运算符右侧的表达式,可以是算术表达式,也可以是一个,赋值表达式,。,赋值运算符依据“自右而左”的结合挨次,因此,x=(y=15)和x=y=15等价。,赋值表达式,赋值表达式的值,被赋变量的值,留意,18,例1,float a;int b;,a=1.2;,b=a*3;,?b,b=3,例2,a+=3;,x*=y+8,;,a=a+3;,x=x*(y+8),;,例3,a=,b=5,;,a=7+(b=8),;,?a,b,a=5;b=5,a=15;b=8,自右而左,的结合性,例4,a=10;,a+=a*=a,;,?a,a=200,例5,y=23;,printf(“%d“,x=y);,?x,输出,x=23,23,在一个语句中可以,完成赋值和输出,两种操作功能,19,3.3 自增自减运算,自增、自减运算符,作用:自增运算符使单个变量的值增1;,自减运算符使单个变量的值减1。,i=i+1,i=i-1,格式:前置:+i,-i 在使用i之前,使i的值加减1,后置:i+,i-在使用i之后,使i的值加减1,几点说明,(1)自增自减运算符只对单个变量进展操作,称为单目运算符或一元运算符。不能用于常量和表达式。,例如,5+、-(a+b)等都是非法的。,(2)常用于循环语句中使循环把握变量自动加或减1,也用于指针变量,使指针指向上一个或下一个地址。,(3)对于+n和n+,单独使用时意义一样,都是使变量n的值加1。,(4)假设用在赋值语句中,意义有所不同。,int n=4,x,y;,x=+n;,/y=n+;,?x,y,x=5,/y=4,20,例3.1,#include“stdio.h“,int main(),int n,x,y;,n=4;,x=+n;,printf(“n=%dtx=%dn“,n,x);,n=4;,y=n+;,printf(“n=%dty=%dn“,n,y);,return 0;,运行结果:,n=5 x=5,n=5 y=4,自增运算符的前置、后置比照。,21,例3.2,#include“stdio.h“,int main(),int n,x,y;,n=4;,x=-n;,printf(“n=%dtx=%dn“,n,x);,n=4;,y=n-;,printf(“n=%dty=%dn“,n,y);,return 0;,运行结果:,n=3 x=3,n=3 y=4,自减运算符的前置与后置比照。,22,#include“stdio.h“,int main(),int n;,n=4;,printf(“%dt“,n);,printf(“%dt“,+n);,printf(“%dnn“,n);,n=4;,printf(“%dt“,n);,printf(“%dt“,n+);,printf(“%dnn“,n);,n=4;,printf(“%dt“,n);,printf(“%dt“,-n);,printf(“%dnn“,n);,n=4;,printf(“%dt“,n);,printf(“%dt“,n-);,printf(“%dnn“,n);,return 0;,运行结果:,4 5 5,4 4 5,4 3 3,4 4 3,例3.3,自增自减运算符在输出语句中。,23,3.4 优先级和类型转换,3.4.1 优先级,3.4.2 类型转换,3.4.2.1 自动类型转换,3.4.2.2 强制类型转换,24,3.4.1 优先级,优先级,结合性,假设一个表达式中有多个运算符,那么用来规定运算先后挨次的规章称为优先级法则。,当表达式中参与运算的多个运算符具有一样优先级时,用来规定运算的先后挨次。,已经介绍运算符的优先级和结合性,优先级,结合性,算数运算符,(),+,-,+,-(单目),*,/,%,+,-,由左向右,由右向左,由左向右,由左向右,赋值运算符,=,复合赋值运算符,由右向左,25,类型转换,自动类型转换,不同类型数据参与运算时,将一种类型的数据转换为另一种兼容的类型。,double x;,,x=45;,/x取值为45.0,整型数据45自动转换为double类型数据。,int a;,a=123.756;/a取值123,小数局部被截去。,类型转换,类型转换分类,自动转换隐式转换:转换隐蔽在操作中,强制转换显示转换:使用强制转换运算符,自动转换举例,2+4.5 /整型数据2转换为double类型数2.0,再与4.5进展加法运算,是自动转换过程。,先转换、后运算,实型整型:,实行截去小数局部的策略,,而不是四舍五入。,26,转换规章,double,float,long,unsigned,int,char,short,高,低,1、纵向向上的箭头表示不同类型的,转换方向由低类型转化为高类,型,不表示转换所经的步骤。,2、横向向左的箭头表示必需的转换。,自动类型转换规章,说明:,必定的转换,运算对象类型,不同时转换,27,3.4.2.2 强制类型转换,一般形式,(要转换成的数据类型)(被转换的表达式),注:当被转换的表达式是一个简洁表达式时,外面的一对圆括号可以缺省。,举例,float x,y;x=2.3;y=4.5;,(int)(x+y),(int)x+y,说明,强制转换得到的是所需类型的中间变量,原变量或表达式的类型不变。,/6,(int),/6.5,(double),28,#include“stdio.h“,int main(),int x,y;,float ave;,x=12;y=25;,ave=(x+y)/2;,printf(“ave=%fn“,ave);,return 0;,运行结果:,ave=18.000000,其中表达式(x+y)/2依据整数除法的规章进展,结果截去了小数局部的值。,例3.4,自动转换效果举例。,29,在程序中参与强制类型转换运算符,#include“stdio.h“,int main(),int x,y;,float ave;,x=12;y=25;,ave=(float)(x+y)/2;,printf(“ave=%fn“,ave);,return 0;,运行结果:,ave=18.500000,其中表达式(float)(x+y)/2将(x+y)强制转换为float类型,再依据混合除法运算的规章进展,结果保存了小数局部的值。,例3.5,使用强制类型转换例如。,30,思考:以下程序的运行结果。,#in