c语言数据运算PPT课件下载推荐.ppt
《c语言数据运算PPT课件下载推荐.ppt》由会员分享,可在线阅读,更多相关《c语言数据运算PPT课件下载推荐.ppt(35页珍藏版)》请在冰豆网上搜索。
x+y*s-a+4/5*32与(x+(y*(s-a)+4)/5)*32,3.算术表达式求值规则
(1)算术运算符的优先级和结合性优先级:
不同的运算符同时出现在表达式中时,进行运算的优先次序结合性:
同一优先级的运算符同时出现在同一表达式中时,进行运算的顺序,-+i-i+5*6%4/3a+b-c用圆括号可以提高某个运算符的优先级或结合性,但不允许使用方括号或花括号。
x+y*s-a+4/5*32与(x+(y*(s-a)+4)/5)*32,【例3-2】算术表达式计算优先级和结合性规则。
#includevoidmain()inta=3,b=5,c=15,d=2;
printf(%dn,6-a*b/c%d);
printf(%dn,+a-a+);
C编绎系统先将所有的char和shortint都转换成int,所有的float都转换成double。
如果表达式中只含同类型的运算量,则直接进行运算,运算结果即表达式的值也是同类型的。
3/2值为1(整型)3.0/2.0值为1.5(双精度型)A+B值为131(int)型如果表达式中含有不同运算类型的运算量,先将精度较低的运算量转化成精度较高的类型,再与精度较高的运算量进行运算,得到的运算结果为精度较高的类型。
(2)自动类型转换规则,【例3-3】算术表达式计算自动类型转换规则,#includevoidmain()charch=a;
inti=5;
unsignedintj=6;
longintk=12;
floatf=3.0;
doubled=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)intlonglongdoubledoubledoublelongdoubledoubledouble-,表达式ch/i+i*k-(j+k)*(f*d)/(f+i)中含有多种类型的变量,根据优先级和结合性规则及自动类型转换规则进行计算,计算过程如图所示。
(3)强制类型转换规则,当算术表达式中需要违反自动类型转换规则,或者说自动类型转换规则达不到目的时,可以使用强制类型转换,其格式为:
(类型关键字)(表达式)(double)a强制将变量a转换成double型(int)(x+y)强制将表达式(x+y)的值转换成int型(int)x+y强制将变量x转换成int型,然后与y相加其中包围类型关键字的圆括号必不可少。
使用强制应注意以下几点:
(1)在进行强制类型转换时,类型关键字必须用括号括住。
例如(int)x不能写成intx。
(2)在对一个表达式进行强制类型转换时,整个表达式也应该用括号括住。
例如,(float)(a+b)若写成(float)a+b就只对变量a进行了强制类型转换。
(3)在对变量或表达式进行了强制类型转换后,并不改变原变量或表达式的类型。
例如,设x为float型,y为double型,则(int)(x+y)为int型,而x+y仍然是double型。
(4)将float型或double型强制转换成int型时,对小数部分是四舍五入还是简单地截断,取决于具体的系统。
VC+采用的是截断小数的办法。
2.5000001VC+对高精度类型转换乘低精度类型增强了检查能力,因此,对float型变量用double型常数初始化将给出警告。
【例3-4】算术表达式计算强制类型转换规则。
#includevoidmain()inta=7,x=3,y=2;
floatb=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/赋值表达式赋值运算符:
+=-=*=/=%=,前五种复合赋值运算符具有算术运算和赋值的双重功能;
后五种复合赋值运算符则具有位运算和赋值的双重功能。
2.赋值表达式的值和类型在赋值表达式中,被赋值的变量得到的值就是赋值表达式的值,而被赋值的变量的类型就是赋值表达式的类型。
例如,在形如v=e的赋值表达式中,变量v的值就是该赋值表达式的值,变量v的类型也就是赋值表达式的类型。
#includevoidmain()inta=-1;
unsignedintb;
b=a;
/低精度转换成高精度printf(%d%un,a,b);
#includevoidmain()inta;
charb;
floatc;
c=2.5;
/高精度转换成低精度b=c;
/高精度转换成低精度a=b;
/低精度转换成高精度printf(%d,%d,%.1f,a,b,c);
2,2,2.5,-14294967295,3.赋值表达式中的数据类型转换在v=e这样的赋值表达式中,当v和e的数据类型不一致时,C编译系统自动将e的类型转换成与v相同的类型后再赋值。
【例3.53.6】赋值表达式中的数据类型转换。
【例3-7】复合赋值运算符和赋值表达式作为运算量。
#includevoidmain()inta=12;
a+=a-=a*a;
/赋值表达式作为运算量printf(3%dn,a);
运行结果-264,3.3逗号运算,1.逗号运算符(顺序运算符)用逗号运算符将几个表达式连接在一起就构成逗号表达式。
a=3*5,a*4,a+5;
t=a,a=b,b=t;
2.逗号表达式的值逗号表达式中最右边的一个表达式的值视为逗号表达式的值。
inta=5;
a=3*5,a*4,a+5/该逗号表达式的值=?
a=(3*5,a*4,a+5)/该赋值表达式的值=?
【例3-8】逗号运算符及逗号表达式。
#includevoidmain()intc=5;
printf(%d,%d,%dn,c+=c+,c+8,+c);
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)当某些语法位置只允许出现一个表达式时,用逗号表达式可实现多个表达式的运算,例如后面要介绍的for循环:
for(i=0,j=0;
i8,j10;
i+,j+)中的三个语法位置:
循环变量赋初值、循环终止条件判断和循环变量增值都只允许一个表达式,用逗号表达式可实现两个或多个表达式的运算。
3.逗号表达式的应用,1.关系运算符,3.4关系运算和逻辑运算,2.关系表达式,
(1)用一个关系运算符连接两个算术或赋值表达式a+b=c-dx=yscore90
(2)用“=”或“!
=”连接两个关系表达式xy!
=yza+b=c+d关系表达式的值是一个逻辑值:
逻辑真和逻辑假。
逻辑真:
1printf(“%d”,32!
=25);
逻辑假:
0printf(“%d”,25=32);
【例3-9】关系表达式的计算。
#includevoidmain()intx=8,y,z;
y=z=x+;
printf(%d,(xy)=(z=x-1);
x=y=z;
printf(%d,x);
printf(%dn,x+=+y-z-);
011,3.逻辑运算符,4.逻辑表达式,用逻辑运算符连接关系表达式或任意数值型表达式。
charch=a;
intx=5;
ch=A&
ch=a&
ch=0&
x=x=025&
-3其值得10|356其值得1!
(-23)其值得0,1,【例3-10】逻辑表达式的计算和逻辑表达式的值。
#include#defineEOF1voidmain()inta=3,b=4,c=5;
printf(%dn,3*(a+b)c,逻辑表达式的特殊计算问题形如(表达式1)&
(表达式2)&
的逻辑表达式计算到第一个为逻辑假的表达式,就可判定整个逻辑表达式为逻辑假,其后的表达式将不被计算。
形如(表达式1)|(表达式2)|的逻辑表达式时计算到第一个为逻辑“真”的表达式,就可判定整个逻辑表达式为逻辑“真”,其后的表达式将不被计算。
【例3-11】逻辑表达式中的特殊计算规则。
#includevoidmain()inta=1,b=2,c=3,d=4,m=2,n=2;
(m=ab),02,3.5测试数据长度运算,C语言并不规定各种类型的数据占用多大的存储空间,这与宿主机器的硬件特性有关。
为了能够确定某一种类型数据的长度,C语言提供了测试数据长度运算符sizeof,它的一般格式为:
sizeof(exp)其中,exp可以是类型关键字、变量或表达式。
其功能是给出exp所代表的数据类型、变量或表达式占用的内存字节数。
sizeof(double),sizeof(x),sizeof(a+b),sizeof(3*1.46/7.28)sizeof是一元运算符,它的优先级与+、-、&
、等相同,结合性为从右至左。
【例3-12】用sizeof测试VC+6.0中各种数据类型的长度。
#includevoidmain()charch=a;
intx=5,y=6;
floata=1.28f,b=3000.0f;
printf(char:
%dn,sizeof(ch);
printf(shortint:
%dint:
%dlongint:
%dn,sizeof(shortint),sizeof(int),sizeof(longint);
printf(float:
%dn,sizeof(a);
printf(double:
%dlongdouble:
%dn,sizeof(double),sizeof(longdouble);
printf(intexpress:
%dn,sizeof(x+y);
printf(floatexpress:
%dn,sizeof(a+b);
printf(characterexpress:
%dn,sizeof(a-0);
char:
1shortint:
2int:
4longint:
4float:
4doubl