您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 大学C语言实用教程(课件)-第3章
第3章数据运算大学C语言实用教程计算机的基本功能是进行数据处理,而数据处理主要是通过对表达式的计算完成的。表达式是将运算量用运算符连接起来组成的式子,其中运算量可以是常量、变量或函数。由于运算量划分为不同的数据类型,每一种数据类型都规定了自己特有的运算或操作,这就形成了对应于不同数据类型的运算符集合及其相应的求值规则。必须连接两个运算量的运算符称为二元运算符a+ba%ba/b只连接一个运算量的运算符称为一元运算符-aa++--b运算符功能说明+-++--正负号、自加、自减一元运算符*/%乘除求余数二元运算符+-加减二元运算符3.1算术运算1.算术运算符用算术运算符连接数值型的运算量而得到的式子。-5*3+6%4/2-1(a+b)/(a-b)a+(b++)*c(1)求余运算的规则假设两个整数分别为a和b,则a%b=a-a/b*b8%3=2,-8%3=-2,8%(-3)=2-8%(-3)=-2(2)自加(加1)自减(减1)运算++i表示i=i+1--i表示i=i-12.算术表达式①++或--可以用于前缀,也可以用于后缀。++n表示先令n=n+1,然后取n的值//先运算后变化n++表示先取n的值,然后令n=n+1//先运算后变化②如果前缀或后缀运算形成一条语句,其运算结果是相同的。例如,设i=5,则i++;及++i;运算后,i的值均为6。100101101100【例】加1和减1运算。#includestdio.hvoidmain(){inta=100;printf(%d\n,a);printf(%d\n,++a);//前缀printf(%d\n,a--);//后缀printf(%d\n,a);}运算符功能优先级结合性+-++--正号负号自加自减自右向左*/%乘除求余自左向右+-加减自左向右-++i-i++5*6%4/3a+b-c③用圆括号可以提高某个运算符的优先级或结合性,但不允许使用方括号或花括号。x+y*s-a+4/5*32与(x+(y*(s-a)+4)/5)*323.算术表达式求值规则(1)算术运算符的优先级和结合性①优先级:不同的运算符同时出现在表达式中时,进行运算的优先次序②结合性:同一优先级的运算符同时出现在同一表达式中时,进行运算的顺序【例】算术表达式计算优先级和结合性规则。#includestdio.hvoidmain(){inta=3,b=5,c=15,d=2;printf(%d\n,6-a*b/c%d);printf(%d\n,++a-a++);printf(%d\n,a);}①C编绎系统先将所有的char和shortint都转换成int,所有的float都转换成double。②如果表达式中只含同类型的运算量,则直接进行运算,运算结果即表达式的值也是同类型的。3/2值为1(整型)3.0/2.0值为1.5(双精度型)‘A’+’B’值为131(int)型③如果表达式中含有不同运算类型的运算量,先将精度较低的运算量转化成精度较高的类型,再与精度较高的运算量进行运算,得到的运算结果为精度较高的类型。(2)自动类型转换规则【例】算术表达式计算自动类型转换规则#includestdio.hvoidmain(){charch='a';inti=5;unsignedintj=6;longintk=12;floatf=3.0;doubled=6.0;printf(“%lf\n”,ch/i+i*k-(j+k)*(f*d)/(f+i));}38.500000ch/i+i*k-(j+k)*(f*d)/(f+i)││││││││││int│long│long│double│doubledouble││││││││││└┬┘└┬┘└┬┘└┬┘└┬┘④⑤①②③long│double││└─┬─┘└──┬─┘double⑧⑥│double└──-─┬──┘│⑦└─────┬──────-─┘⑨表达式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型常数初始化将给出警告。【例】算术表达式计算强制类型转换规则。#includestdio.hvoidmain(){inta=7,x=3,y=2;floatb=2.5F,c=4.7F,z=3.5F;printf(%f\n,b+a%3*(int)(b+c)%2/4);printf(%d\n,(x+y)%2+(int)b/(int)z);}3.2赋值运算1.赋值运算符和赋值表达式v=e;//赋值语句v=e//赋值表达式赋值运算符:+=-=*=/=%===&=|=^=x=x+1;a=a-1;c=c*(2+x);x+=1;a-=1;c*=2+x;前五种复合赋值运算符具有算术运算和赋值的双重功能;后五种复合赋值运算符则具有位运算和赋值的双重功能。2.赋值表达式的值和类型在赋值表达式中,被赋值的变量得到的值就是赋值表达式的值,而被赋值的变量的类型就是赋值表达式的类型。例如,在形如v=e的赋值表达式中,变量v的值就是该赋值表达式的值,变量v的类型也就是赋值表达式的类型。#includestdio.hvoidmain(){inta=-1;unsignedintb;b=a;//低精度转换成高精度printf(%d%u\n,a,b);}#includestdio.hvoidmain(){inta;charb;floatc;c=2.5;//高精度转换成低精度b=c;//高精度转换成低精度a=b;//低精度转换成高精度printf(%d,%d,%.1f,a,b,c);}2,2,2.5-142949672953.赋值表达式中的数据类型转换在v=e这样的赋值表达式中,当v和e的数据类型不一致时,C编译系统自动将e的类型转换成与v相同的类型后再赋值。【例3.5~3.6】赋值表达式中的数据类型转换。-264【例3.7】复合赋值运算符和赋值表达式作为运算量。#includestdio.hvoidmain(){inta=12;a=a-a*a;a=a+a;a+=a-=a*a;//赋值表达式作为运算量printf(%d\n,a);}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//该逗号表达式的值=?inta=5;a=(3*5,a*4,a+5)//该赋值表达式的值=?【例】逗号运算符及逗号表达式。#includestdio.hvoidmain(){intc=5;printf(%d,%d,%d\n,c+=c++,c+8,++c);c=5;printf(%d\n,(c+=c++,c+8,++c));c=5;printf(%d\n,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);【例】关系表达式的计算。#includestdio.hvoidmain(){intx=8,y,z;y=z=x++;printf(%d,(xy)==(z=x-1));x=y==z;printf(%d,x);printf(%d\n,x++=++y-z--);}0113.逻辑运算符运算符功能优先级结合性!逻辑非自右向左&&逻辑与自左向右||逻辑或自左向右pqp&&qP||q!p000010101110010111104.逻辑表达式用逻辑运算符连接关系表达式或任意数值型表达式。charch=‘a’;intx=5;ch=‘A’&&ch=‘Z’||ch=‘a’&&ch=‘z’x=0&&x=10//10=x=025&&-3其值得10||356其值得1!(-23)其值得01【例】逻辑表达式的计算和逻辑表达式的值。#includestdio.h#defineEOF1voidmain(){inta=3,b=4,c=5;printf(%d\n,3*(a+b)c&&a++||c!=0&&!EOF);}逻辑表达式的特殊计算问题①形如(表达式1)&&(表达式2)&&…的逻辑表达式计算到第一个为逻辑假的表达式,就可判定整个逻辑表达式为逻辑假,其后的表达式将不被计算。②形如(表达式1)||(表达式2)||…的逻辑表达式时计算到第一个为逻辑“真”的表达式,就可判定整个逻辑表达式为逻辑“真”,其后的表达式将不被计算。【例】逻辑表达式中的特殊计算规则。#includestdio.hvoidmain(){inta=1,b=2,c=3,d=4,m=2,n=2;(m=ab)&&(n=cd);printf(%d%d\n,m,n);}023.5测试数据长度运算C语言并不规定各种类型的数据占用多大的存储空间,这与宿主机器的硬件特性有关。为了能够确定某一种类型数据的长度,C语言提供了测试数据长度运算符sizeof,它的一般格式为:sizeof(exp)其中,exp可以是类型关键字、变量或表达式。其功能是给出exp所代表的数据类型、变量或表达式占用的内存字节数。sizeof(double),sizeof(x),sizeof(a+b),sizeof(3*1.46/7.28)sizeof是一元运算符,它的优先级与++、--、&、~等相同,结合性为从右至左。【例】用sizeof测试VC++6.0中各种数据类型的长度。#includestdio.hvoidmain(){charch='a';intx=5,y=6;floata=1.28f,
本文标题:大学C语言实用教程(课件)-第3章
链接地址:https://www.777doc.com/doc-2547974 .html