《大学C语言实用教程第章ppt课件》由会员分享,可在线阅读,更多相关《大学C语言实用教程第章ppt课件(33页珍藏版)》请在金锄头文库上搜索。
1、第第 3 章章 数据运算数据运算大学大学C言言语适用教程适用教程 计计算机的根本功能是算机的根本功能是算机的根本功能是算机的根本功能是进进展数据展数据展数据展数据处处置,而数据置,而数据置,而数据置,而数据处处置主要是置主要是置主要是置主要是经过对经过对表达式的表达式的表达式的表达式的计计算完成的。表达式是将算完成的。表达式是将算完成的。表达式是将算完成的。表达式是将运算量用运算符运算量用运算符运算量用运算符运算量用运算符衔衔接起来接起来接起来接起来组组成的式子,其中运算量成的式子,其中运算量成的式子,其中运算量成的式子,其中运算量可以是常量、可以是常量、可以是常量、可以是常量、变变量或函数。
2、由于运算量划分量或函数。由于运算量划分量或函数。由于运算量划分量或函数。由于运算量划分为为不同不同不同不同的数据的数据的数据的数据类类型,每一种数据型,每一种数据型,每一种数据型,每一种数据类类型都型都型都型都规规定了本人特有的定了本人特有的定了本人特有的定了本人特有的运算或操作,运算或操作,运算或操作,运算或操作,这这就构成了就构成了就构成了就构成了对应对应于不同数据于不同数据于不同数据于不同数据类类型的运型的运型的运型的运算符集合及其相算符集合及其相算符集合及其相算符集合及其相应应的求的求的求的求值规值规那么。那么。那么。那么。 必需衔接两个运算量的运算符称为二元运算符必需衔接两个运算量的
3、运算符称为二元运算符 a+b a%b a/b 只衔接一个运算量的运算符称为一元运算符只衔接一个运算量的运算符称为一元运算符 -a a+ -b运算符运算符功能功能说明说明+ - + -正负号、自加、自减正负号、自加、自减一元运算符一元运算符* / %乘乘 除除 求余数求余数二元运算符二元运算符+ -加加 减减二元运算符二元运算符3.1 3.1 算算算算术术运算运算运算运算1. 算术运算符算术运算符用算术运算符衔接数值型的运算量而得到的式子。用算术运算符衔接数值型的运算量而得到的式子。 -5*3+6%4/2-1 (a+b)/(a-b) a+(b+)*c 1求余运算的规那么求余运算的规那么 假设两个
4、整数分别为假设两个整数分别为a和和b,那么,那么a%b=a-a/b*b 8%3=2,-8%3=-2,8%(-3)=2 -8%(-3)=-22自加加自加加1自减减自减减1运算运算 +i 表示表示i=i+1 -i 表示表示i=i-12. 算术表达式算术表达式 +或或-可以用于前可以用于前缀,也可以用于后,也可以用于后缀。 +n 表示先令表示先令n=n+1,然后取然后取n的的值 /先运算后先运算后变化化 n+ 表示先取表示先取n的的值,然后令,然后令n=n+1 /先运算后先运算后变化化 假假设前前缀或后或后缀运算构成一条运算构成一条语句,其运算句,其运算结果是一果是一样的。的。例如,例如,设 i=5
5、,那么,那么 i+;及及 +i;运算后,运算后,i的的值均均为6。100101101100【例】加【例】加1和减和减1运算。运算。 #include void main() int a=100; printf(%dn,a); printf(%dn,+a); /前前缀 printf(%dn,a-); /后后缀 printf(%dn,a); 运算符运算符功能功能优先级优先级结合性结合性+ - + - 正号正号 负号负号 自加自加 自减自减自右向左自右向左* / %乘乘 除除 求余求余自左向右自左向右+ -加加 减减自左向右自左向右 -+i -i+ 5*6%4/3 a+b-c 用用圆括号可以提高某个
6、运算符的括号可以提高某个运算符的优先先级或或结合性,但不允合性,但不允许运运用方括号或花括号。用方括号或花括号。 x+y*s-a+4/5*32与与(x+(y*(s-a)+4)/5)*323. 算算术表达式求表达式求值规那么那么1算算术运算符的运算符的优先先级和和结合性合性优先先级:不同的运算符同:不同的运算符同时出如今表达式中出如今表达式中时,进展运算展运算的的优先次序先次序结合性:同一合性:同一优先先级的运算符同的运算符同时出如今同一表达式中出如今同一表达式中时,进展运算的展运算的顺序序【例】【例】【例】【例】 算算算算术术表达式表达式表达式表达式计计算算算算优优先先先先级级和和和和结结合性
7、合性合性合性规规那么。那么。那么。那么。 #include void main() int a=3,b=5,c=15,d=2; printf(%dn,6-a*b/c%d); printf(%dn,+a-a+); printf(%dn,a); C编绎系系统先将一切的先将一切的char和和short int都都转换成成int,一切的,一切的float都都转换成成double。 假假设表达式中只含同表达式中只含同类型的运算量,那么直接型的运算量,那么直接进展运算,运展运算,运算算结果即表达式的果即表达式的值也是同也是同类型的。型的。 3/2 值为1(整型整型) 3.0/2.0 值为1.5(双精度型双
8、精度型) A+B 值为131(int)型型 假假设表达式中含有不同运算表达式中含有不同运算类型的运算量,先将精度型的运算量,先将精度较低的低的运算量运算量转化成精度化成精度较高的高的类型,再与精度型,再与精度较高的运算量高的运算量进展运展运算,得到的运算算,得到的运算结果果为精度精度较高的高的类型。型。2自动类型转换规那么自动类型转换规那么【例】【例】 算术表达式计算自动类型转换规那么算术表达式计算自动类型转换规那么 #include void main() char ch=a; int i=5; unsigned int j=6; long int k=12; float f=3.0; do
9、uble d=6.0; printf(“%lfn,ch/i+i*k-(j+k)*(f*d)/(f+i); 38.500000 ch /i + i * k -( j + k )*( f * d )/( f + i ) int long long double double double long double double double - - 表达式表达式表达式表达式ch/i+i*k-(j+k)*(f*d)/(f+i)ch/i+i*k-(j+k)*(f*d)/(f+i)中含有多种中含有多种中含有多种中含有多种类类型的型的型的型的变变量,根据量,根据量,根据量,根据优优先先先先级级和和和和结结合
10、性合性合性合性规规那么及自那么及自那么及自那么及自动类动类型型型型转换规转换规那么那么那么那么进进展展展展计计算,算,算,算,计计算算算算过过程如下程如下程如下程如下图图。3强迫类型转换规那么强迫类型转换规那么 当算当算当算当算术术表达式中需求表达式中需求表达式中需求表达式中需求违违反自反自反自反自动类动类型型型型转换规转换规那么,或者那么,或者那么,或者那么,或者说说自自自自动类动类型型型型转换规转换规那么达不到目的那么达不到目的那么达不到目的那么达不到目的时时,可以运用,可以运用,可以运用,可以运用强强迫迫迫迫类类型型型型转换转换,其,其,其,其格式格式格式格式为为: ( (类类型关型关型
11、关型关键键字字字字)( )(表达式表达式表达式表达式) ) (double)a (double)a 强强迫将迫将迫将迫将变变量量量量a a转换转换成成成成doubledouble型型型型 (int)(x+y) (int)(x+y) 强强迫将表达式迫将表达式迫将表达式迫将表达式(x+y)(x+y)转换转换成成成成intint型型型型 (int)x+y (int)x+y 强强迫将迫将迫将迫将变变量量量量x x转换转换成成成成intint型,然后与型,然后与型,然后与型,然后与y y相加相加相加相加其中包其中包其中包其中包围类围类型关型关型关型关键键字的字的字的字的圆圆括号必不可少。括号必不可少。括
12、号必不可少。括号必不可少。运用强迫应留意以下几点:运用强迫应留意以下几点:1在进展强迫类型转换时,类型关键字必需用括号括住。例在进展强迫类型转换时,类型关键字必需用括号括住。例如如(int)x不能写成不能写成int x。2在对一个表达式进展强迫类型转换时,整个表达式也应该在对一个表达式进展强迫类型转换时,整个表达式也应该用括号括住。例如,用括号括住。例如,(float)(a+b)假设写成假设写成(float)a+b就只对就只对变量变量a进展了强迫类型转换。进展了强迫类型转换。3在对变量或表达式进展了强迫类型转换后,并不改动原变在对变量或表达式进展了强迫类型转换后,并不改动原变量或表达式的类型。
13、例如,设量或表达式的类型。例如,设x为为float型,型,y为为double型,那么型,那么(int)(x+y)为为int型,而型,而x+y依然是依然是double型。型。4将将float型或型或double型强迫转换成型强迫转换成int型时,对小数部分是四型时,对小数部分是四舍五入还是简单地截断,取决于详细的系统。舍五入还是简单地截断,取决于详细的系统。VC+采用的是截采用的是截断小数的方法。断小数的方法。 2.500000 1 VC+对高精度高精度类型型转换乘低精度乘低精度类型加型加强了了检查才干,才干,因此,因此,对float型型变量用量用double型常数初始化将型常数初始化将给出警告
14、。出警告。【例】算术表达式计算强迫类型转换规那么。【例】算术表达式计算强迫类型转换规那么。 #include void main() int a=7,x=3,y=2; float b=2.5F,c=4.7F,z=3.5F; printf(%fn,b+a%3*(int)(b+c)%2/4); printf(%dn,(x+y)%2+(int)b/(int)z); 3.2 赋值运算赋值运算1. 赋值运算符和赋值表达式赋值运算符和赋值表达式 v=e; / 赋值语句赋值语句 v=e / 赋值表达式赋值表达式 赋值运算符:赋值运算符: += -= *= /= %= = &= |= = x=x+1; a=a
15、-1; c=c*(2+x); x+=1; a-=1; c*=2+x; 前五种复合前五种复合前五种复合前五种复合赋值赋值运算符具有算运算符具有算运算符具有算运算符具有算术术运算和运算和运算和运算和赋值赋值的双重功能;的双重功能;的双重功能;的双重功能;后五种复合后五种复合后五种复合后五种复合赋值赋值运算符那么具有位运算和运算符那么具有位运算和运算符那么具有位运算和运算符那么具有位运算和赋值赋值的双重功能。的双重功能。的双重功能。的双重功能。 2. 赋值表达式的值和类型赋值表达式的值和类型 在赋值表达式中,被赋值的变量得到的值就是赋值表达式在赋值表达式中,被赋值的变量得到的值就是赋值表达式的值,而
16、被赋值的变量的类型就是赋值表达式的类型。的值,而被赋值的变量的类型就是赋值表达式的类型。例如,在形如例如,在形如 v=e的赋值表达式中,变量的赋值表达式中,变量v的值就是该赋值表达式的值,变量的值就是该赋值表达式的值,变量v的的类型也就是赋值表达式的类型。类型也就是赋值表达式的类型。#include void main() int a=-1; unsigned int b; b=a; / 低精度低精度转换成高精度成高精度 printf(%d %un,a,b); #include void main() int a; char b; float c; c=2.5; / 高精度高精度转换成低精度成
17、低精度 b=c; / 高精度高精度转换成低精度成低精度 a=b; / 低精度低精度转换成高精度成高精度 printf(%d,%d,%.1f,a,b,c);2,2,2.5-1 42949672953. 赋值表达式中的数据类型转换赋值表达式中的数据类型转换 在在v=e这样的赋值表达式中,当这样的赋值表达式中,当v和和e的数据类型不一致时,的数据类型不一致时,C编译系统自动将编译系统自动将e的类型转换成与的类型转换成与v一样的类型后再赋值。一样的类型后再赋值。【例【例3.53.6】 赋值表达式中的数据类型转换。赋值表达式中的数据类型转换。-264【例【例3.7】复合赋值运算符和赋值表达式作为运算量。
18、】复合赋值运算符和赋值表达式作为运算量。 #include void main() int a=12; a=a-a*a; a=a+a; a+=a-=a*a; / 赋值表达式作为运算量赋值表达式作为运算量 printf(%dn,a); 3.3 逗号运算逗号运算1. 逗号运算符顺序运算符逗号运算符顺序运算符 用逗号运算符将几个表达式衔接在一同就构成逗号表达式。用逗号运算符将几个表达式衔接在一同就构成逗号表达式。 a=3*5,a*4,a+5; t=a,a=b,b=t;2. 逗号表达式的值逗号表达式的值 逗号表达式中最右边的一个表达式的值视为逗号表达式的值。逗号表达式中最右边的一个表达式的值视为逗号表
19、达式的值。 int a=5; a=3*5,a*4,a+5 / 该逗号表达式的值该逗号表达式的值=? int a=5; a=(3*5,a*4,a+5) / 该赋值表达式的值该赋值表达式的值=?【例】逗号运算符及逗号表达式。【例】逗号运算符及逗号表达式。【例】逗号运算符及逗号表达式。【例】逗号运算符及逗号表达式。 #include #include void main() void main() int c=5; int c=5; printf(%d,%d,%dn,c+=c+,c+8,+c); printf(%d,%d,%dn,c+=c+,c+8,+c); c=5; c=5; printf(%dn
20、,(c+=c+,c+8,+c); printf(%dn,(c+=c+,c+8,+c); c=5; c=5; printf(%dn,c+=c+,c+8,+c); printf(%dn,c+=c+,c+8,+c); 1用一个逗号表达式语句可替代多个赋值语句,如用一个逗号表达式语句可替代多个赋值语句,如 a=0;b=1;c=2; 可写成可写成 a=0,b=1,c=2; 2用一个逗号表达式语句可得到多个计算结果,如用一个逗号表达式语句可得到多个计算结果,如 y=10; x=(y=y-5,60/y); 执行后,执行后,x的值为的值为12,y的值为的值为5。3当某些语法位置只允许出现一个表达式时,用逗号表
21、达式可实当某些语法位置只允许出现一个表达式时,用逗号表达式可实现多个表达式的运算,例如后面要引见的现多个表达式的运算,例如后面要引见的for循环:循环: for(i=0,j=0;i8,j、 = =c-d x=y score902用用“=或或“!=衔接两个关系表达式接两个关系表达式 xy!=yz a+b=c+d关系表达式的关系表达式的值是一个是一个逻辑值:逻辑真和真和逻辑假。假。 逻辑真:真:1 printf(“%d,32!=25); 逻辑假:假:0 printf(“%d,25=32);【例】关系表达式的【例】关系表达式的【例】关系表达式的【例】关系表达式的计计算。算。算。算。#include
22、void main() int x=8,y,z; y=z=x+; printf(%d ,(xy)=(z=x-1); x=y=z; printf(%d ,x); printf(%dn,x+=+y-z-); 0 1 13. 逻辑运算符逻辑运算符运算符运算符功能功能优先级优先级结合性结合性!逻辑非逻辑非自右向左自右向左&逻辑与逻辑与自左向右自左向右|逻辑或逻辑或自左向右自左向右pqp&qP|q!p000010101110010111104. 逻辑表达式逻辑表达式用用用用逻辑逻辑运算符运算符运算符运算符衔衔接关系表达式或恣意数接关系表达式或恣意数接关系表达式或恣意数接关系表达式或恣意数值值型表达式。型
23、表达式。型表达式。型表达式。 char ch=a; int x=5; char ch=a; int x=5; ch=A&ch=a&ch=A&ch=a&ch=0&x=x=0 x=0&x=x=0 25&-3 25&-3 其其其其值值得得得得1 1 0|356 0|356 其其其其值值得得得得1 1 !(-23) !(-23) 其其其其值值得得得得0 01【例】逻辑表达式的计算和逻辑表达式的值。【例】逻辑表达式的计算和逻辑表达式的值。 #include #define EOF 1 void main() int a=3,b=4,c=5; printf(%dn,3*(a+b)c&a+|c!=0&!EO
24、F); 逻辑表达式的特殊表达式的特殊计算算问题 形如形如( (表达式表达式1)&(1)&(表达式表达式2)&2)&的的逻辑表达式表达式 计算到第一个算到第一个为逻辑假的表达式,就可断定整个假的表达式,就可断定整个逻辑表达式表达式为逻辑假,其后的表达式将不被假,其后的表达式将不被计算。算。 形如形如( (表达式表达式1)|(1)|(表达式表达式2)|2)|的的逻辑表达式表达式时 计算到第一个算到第一个为逻辑“真的表达式,就可断定整个真的表达式,就可断定整个逻辑表达式表达式为逻辑“真,其后的表达式将不被真,其后的表达式将不被计算。算。【例】【例】逻辑表达式中的特殊表达式中的特殊计算算规那么。那么。
25、 #include void main() int a=1,b=2,c=3,d=4,m=2,n=2; (m=ab)&(n=cd); printf(%d %dn,m,n); 0 23.5 测试数据长度运算测试数据长度运算 C言语并不规定各种类型的数据占用多大的存储空间,这与言语并不规定各种类型的数据占用多大的存储空间,这与宿主机器的硬件特性有关。为了可以确定某一种类型数据的长度,宿主机器的硬件特性有关。为了可以确定某一种类型数据的长度,C言语提供了测试数据长度运算符言语提供了测试数据长度运算符sizeof,它的普通格式为:,它的普通格式为: sizeof (exp)其中,其中,exp可以是类型关
26、键字、变量或表达式。其功能是给出可以是类型关键字、变量或表达式。其功能是给出exp所代表的数据类型、变量或表达式占用的内存字节数。所代表的数据类型、变量或表达式占用的内存字节数。 sizeof(double), sizeof(x), sizeof(a+b), sizeof(3*1.46/7.28) sizeof是一元运算符,它的优先级与是一元运算符,它的优先级与+、-、&、等一样,等一样,结合性为从右至左。结合性为从右至左。【例】用【例】用sizeof测试测试VC+ 6.0中各种数据类型的长度。中各种数据类型的长度。 #include void main() char ch=a; int x=
27、5,y=6; float a=1.28f,b=3000.0f; printf(char:%dn,sizeof(ch); printf(short int:%d int:%d long int:%dn, sizeof(short int),sizeof(int),sizeof (long int); printf(float:%dn,sizeof(a); printf(double:%d long double:%dn, sizeof(double),sizeof(long double); printf(int express:%dn,sizeof(x+y); printf(float exp
28、ress:%dn,sizeof(a+b); printf(character express:%dn,sizeof(a-0); C C 编译编译系系系系统统在在在在标题标题文件文件文件文件math.hmath.h中定中定中定中定义义了众多的数学函数。了众多的数学函数。了众多的数学函数。了众多的数学函数。当需求当需求当需求当需求调调用用用用这这些数学函数些数学函数些数学函数些数学函数时时,要用,要用,要用,要用#include #include 命令行命令行命令行命令行包含包含包含包含该标题该标题文件。下面列出的函数中,自文件。下面列出的函数中,自文件。下面列出的函数中,自文件。下面列出的函数中
29、,自变变量量量量x x和和和和y y为为doubledouble型,型,型,型,n n为为intint型,一切的函数型,一切的函数型,一切的函数型,一切的函数值值均均均均为为doubledouble型,三角函数的自型,三角函数的自型,三角函数的自型,三角函数的自变变量以弧量以弧量以弧量以弧度度度度为单为单位,反三角函数的函数位,反三角函数的函数位,反三角函数的函数位,反三角函数的函数值值以弧度以弧度以弧度以弧度为单为单位。位。位。位。 3.6 常用数学函数常用数学函数 sin(x)x的正弦,值域为-1,1cos(x)x的余弦,值域为-1,1tan(x)x的正切asin(x)x的反正弦,定义域为
30、-1,1,值域为-/2,/2acos(x)x的反余弦,定义域为-1,1,值域为0,atan(x)x的反正切,定义域为-1,1atan2(y,x)y/x的反正切,y/x的取值范围为-1,1sinh(x)x的双曲正弦,即(ex-e-x)/2cosh(x)x的双曲余弦,即(ex+e-x)/2tanh(x)x的双曲正切,即(ex-e-x)/(ex+e-x)exp(x)指数函数,exlog(x)自然对数,即lnx,x0log10(x)常用对数,即lgx,x0pow(x,y)xy,若x=0且y0,或x0但y不是整数时出错pow10(n)幂函数,10nsqrt(x)x的平方根,x0ceil(x)不小于x的最
31、小整数,double型函数,如:ceil(1.02)=2.0,ceil(-1.02)=-1.0floor(x)不大于x的最大整数,double型函数,如:floor(1.02)=1.0, floor(-1.02)=-2.0fabs(x)x的绝对值fmod(x,y)x/y的浮点余数,其符号与x相同。例如:fmod(10.0,3.0)=1.0知识点本章知识点本章l l知知知知识识点点点点1 1:运算符的:运算符的:运算符的:运算符的优优先先先先级级和和和和结结合性合性合性合性 l l知知知知识识点点点点2 2:算:算:算:算术术表达式表达式表达式表达式 l l知知知知识识点点点点3 3:赋值赋值表达式表达式表达式表达式 l l知知知知识识点点点点4 4:关系表达式和:关系表达式和:关系表达式和:关系表达式和逻辑逻辑表达式表达式表达式表达式 l l知知知知识识点点点点5 5:逗号表达式:逗号表达式:逗号表达式:逗号表达式 l l知知知知识识点点点点6 6:条件表达式:条件表达式:条件表达式:条件表达式l l知知知知识识点点点点7 7:测试测试数据数据数据数据长长度运算符度运算符度运算符度运算符