第十三章_对C语言的深入讨论.ppt

上传人:hyn****60 文档编号:70687823 上传时间:2023-01-24 格式:PPT 页数:51 大小:182KB
返回 下载 相关 举报
第十三章_对C语言的深入讨论.ppt_第1页
第1页 / 共51页
第十三章_对C语言的深入讨论.ppt_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《第十三章_对C语言的深入讨论.ppt》由会员分享,可在线阅读,更多相关《第十三章_对C语言的深入讨论.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、函数的递归调用在函数调用过程中,函数直接或间接调用了自己,我们把这种调用称作函数的递归调用。函数直接调用了自己,称作直接调用;函数间接的调用了自己,称作间接调用。在这里只讨论简单的直接递归。使用递归调用的3个条件(1)可以把要解决的问题转化为一个新的问题,而这个新的问题的解决方法仍与原来的解法相同,只是处理的对象有规律地递增或递减。(2)可以应用这个转化过程使问题得到解决。(3)必须有一个明确的结束递归的条件。例13.3以下程序运行后的输出结果是_。fun(intx)if(x/20)fun(x/2);printf(“%d”,x);main()fun(6);(33)有以下程序#includein

2、tf(intt,intn);main()inta4=1,2,3,4,s;s=fa,4;printf(”%dn”,s);intf(intt,intn)if(n0)returntn-1+f(t,n-1);elsereturn0;程序运行后的输出结果是BA)4B)10C)14D)6(15)有以下程序#includefun(intx)if(x/20)fun(x/2);printf(“%d”,x);main()fun(6);printf(“n”);程序运行后的输出结果是【15】(32)设有如下函数定义intfun(intk)if(ky?x:y)max=MAX(10,5);宏展开后,赋值语句为:max=(

3、105?10:5);对带形参的宏定义,说明如下:(1)在替换带参数的宏名时,一对圆括号不能少,圆括号中实参的个数应该与形参的个数相同,如有多个参数,各参数用逗号隔开。(2)与不带参数的宏相同,同一个宏名不能重复定义,除非两个宏定义命令行完全一致。(3)在宏替换行的表达式中的形参和整个表达式应该用括号括起来。例13.7#defineMUL(a,b)(a)*(b)m=MUL(10-5,5+1)/2;结果输出m=_。答案:15(35)以下程序#include#defineSUB(a)(a)-(a)main()inta=2,b=3,c=5,d;d=SUB(a+b)*c;printf(”%dn”,d);

4、程序运行后的结果是A)0B)-12C)-20D)10(35)有以下程序#include#defineS(x)4*(x)*x+1main()intk=5,j=2;printf(%dn,S(k+j);程序运行后的输出结果是A)197B)143C)33D)28(35)有以下程序#include#definef(x)x*x*xmain()inta=3,s,t;s=f(a+1);t=f(a+1);printf(“%d,%dn,s,t);程序运行后的输出结果是A)10,64B)10,10C)64,10D)64,64(36)有以下程序#include#definePT3.5;#defineS(x)PT*x*

5、x;mian()inta=1,b=2;printf(“%4.1fn”,S(a+b);程序运行后输出的结果是A)14.0B)31.5C)7.5D)程序有错无输出结果13.3标识符的作用域一.存储分类根据变量在内存的不同位置,可以将变量分为两类:自动类和静态类自动类和静态类。根据程序中变量定义的位置不同,又可以将变量分为局部变量和全局变量局部变量和全局变量。在函数外部定义的变量是全局变量。局部变量是内部变量,全局变量也称为外部变量。局部变量可以是自动类变量,也可以是静态类变量。全局变量只能是静态类变量。C语言提供了与此相关的4个关键字:auto(自动)register(寄存器)static(静态)

6、extern(外部)。如如:int sum;auto int a,b,c;register int i;static float x,y;二.局部变量局部变量有3种类型:auto、register和static。1.auto变量在定义变量时,如果没有指定相应的存储类型,则系统默认该存储类型为auto类型。当程序进入定义该变量的函数或复合语句时,系统为这些变量临时分配内存单元。当程序离开这个函数或复合语句时,系统将销毁这些内存单元,使其数据不再有效。例例13.9 以下程序的输出结果是以下程序的输出结果是_。main()int i=1,i_sum;float f,f_sum;int i;i=10;

7、printf(“(1)i=%dn”,i);printf(“(2)i=%dn”,i);答案答案(1)i=10 (2)i=12.register变量register变量(寄存器变量)与auto变量一样,是自动类变量,其作用域和生存期与auto变量完全一样。register变量与auto变量唯一的区别是auto变量在内存中分配存储空间,而register变量在CPU的寄存器中分配。寄存器运算速度非常的快,但寄存器数量有限,一般情况下,不建议编程人员使用寄存器变量。3.static变量在函数内部或复合函数语句中定义变量时,如果使用static来说明,就构成了静态局部变量。静态局部变量的作用域与auto

8、和register类型变量一样,但其生存期却完全不一样生存期却完全不一样。静态局部变量在内存的静态存储区占据着永久性的存储单元,即使离开定义该变量的函数(或复合语句),该存储单元也不会被销毁。当下次再进行定义该变量的函数(或复合语句)时,存储单元仍然保存着原来的值。例13.10以下程序运行后的输出结果是_。fun(inta)intb=0;staticintc=3;b+;c+;return(a+b+c);main()inti,a=5;for(i=0;i3;i+)printf(“%d%d”,i,fun(a);printf(“n”);答案:010111212全局变量外部变量定义:在函数外定义,可为本

9、文件所有函数共用有效范围:从定义变量的位置开始到本文件结束,以及有extern说明的其它文件外部变量可用存储类型:缺省 或 static在外部任意位置定义的变量,称为全局变量。全局变量都是静态变量,其作用域从定义的位置开始,到整个源文件结束为止。例13.11以下程序的运行结果是_。intsum;intfun1()sum+=20;inta;intfun2()a=20;sum+=a;main()sum=0;fun1();a=8;fun2();printf(“sum=%da=%d”,sum,a);答案:sum=40a=20(34)有以下程序#includeintfun()staticintx=1;x

10、*=2;returnx;main()intI,s=1;for(i=1;i=2;i+)s=fun();printf(”%dn”,s);程序运行后的输出结果是A)0B)1C)4D)8(34)设函数中有整型变量n,为保证其在未赋值的情况下初值为0,应选择的存储类别是A)autoB)registerC)staticD)auto或register(34)有以下程序#includeintf(intn);main()inta=3,s;s=f(a);s=s+f(a);printf(“%dn”,s);intf(intn)staticinta=1;n+=a+;returnn;程序运行以后的输出结果是A)7B)8

11、C)9D)10(34)有以下程序#includeintfun()staticintx=1;x*=2;returnx;main()inti,s=1;for(i=1;i=3;i+)s*=fun();printf(%dn,s);程序运行后的输出结果是A)0B)10C)30D)6413.4动态存储分配一.malloc函数malloc函数用于分配内存空间。ANSIC标准规定malloc函数返回值的类型为void*,该函数的调用形式为:malloc(size)其中参数size的类型为unsignedint,表示需要分配的内存的字节数。如果系统有足够的内存可供分配,函数返回一个指向有size个字节的存储区首

12、地址,该首地址的基类型为void类型;若没有足够的内存单元可供分配,函数返回空值(NULL)。例13.12malloc函数的应用int*p;float*q;p=(int*)malloc(4);q=(float*)malloc(4);if(p!=NULL)*p=6;If(q!=NULL)*q=3.8;动态分配存储单元p6q3.8动态分配得到的内存单元没有名字,只能通过指针变量来引用它。一旦指针变量的值发生改变,原存储单元及所存数据都将无法再引用。通过调用malloc函数所分配的动态存储单元中没有确定的初值。在调用malloc进行存储分配时,如果不能确定数据类型所占字节数,可以调用sizeof运算

13、符来求得。如上例可以改为:p=(int*)malloc(sizeof(int);q=(float*)malloc(sizeof(float);这是一种常用的方式,它由系统来计算数据类型的字节数。二.free函数通过静态存储分配的变量和数组,在生存期后,或者程序运行结束后,所占用的存储单元会由系统自动释放。但是,动态存储分配的内存单元,必须由程序员手动进行释放。如果没有对其进行释放,则内存单元会一致被占用,从而无法被系统重新分配。我们可以使用free函数释放动态分配的内存单元。free函数的调用形式如下:free(p);这里指针p必须指向由动态分配函数(如malloc)分配的地址。free函数将

14、指针p所指向的空间释放,使部分空间可以由系统重新支配。此函数没有返回值。三.calloc函数通常情况下,malloc函数用于分配单个数据类型的存储单元,但是有时候根据需求可能要分配多个同一类型的连续的存储空间。ANSIC提供了calloc用于此功能的实现,calloc函数的返回值是基类型为void的指针。calloc函数的调用形式:calloc(n,size);其中参数n和size的类型都是unsignedint。calloc函数用来给n个同一类型的数据项分配连续的存储空间,其中每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空值。由calloc函数分配的存储单

15、元,系统自动置初值为0。例13.13int*pint;pint=(int*)calloc(10,sizeof(int);free(pint);程序调用calloc函数在内存中分配了10个连续的int类型的存储空间,由pint指向存储单元的首地址。每个存储单元可以存放一个int型数据。通过free函数释放动态分配的存储空间。(14)以下程序运行后的输出结果是【14】。#include#include#includemain()char*p;inti;p=(char*)malloc(sizeof(char)*20);strcpy(p,welcome);for(i=6;i=0;i-)putchar(

16、*(p+i);printf(n-);free(p);(31)有以下程序#include#includeintfun(intn)int*p;p=(int*)malloc(sizeof(int);*p=n;return*p;main()inta;a=fun(10);printf(%dn,a+fun(10);程序的运行结果是A)0 B)10C)20D)出错(17)以下程序的输出结果是_#include#includemain()char*s1,*s2,m;s1=s2=(char*)malloc(sizeof(char);*s1=15;*s2=20;m=*s1+*s2;printf(“%dn”,m);

17、位运算符和位运算运算符含义&按位与按位或按位异或取反右移位运算赋值运算符&=,|=,=,=2相当于a=a2“按位与按位与”(&)参加运算的两个运算量参加运算的两个运算量,如果两个相应的位都为如果两个相应的位都为1,则该位的结则该位的结果值为果值为1,否则为否则为0.0&0=0 0&1=0 1&0=0 1&1=1例如:例如:3&5-3&-5 3 0 0 0 0 0 0 1 1 (&)5 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 -3 1 1 1 1 1 1 0 1(&)-5 1 1 1 1 1 0 1 1 -7 1 1 1 1 1 0 0 1 按位或”()“两个相应位只要有

18、一个为1,该位的结果值为1.00=010=101=111=1例如:060|017 0 0 1 1 0 0 0 0(|)0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1“异或”()参加运算的两个相应位同号,结果为0(假),异号为1(真).00=010=101=111=0 0 0 1 1 1 0 0 1 (071)()0 0 1 0 1 0 1 0 (052)0 0 0 1 0 0 1 1 (023)“取反”()此运算符是一个单目(元)运算符,对一个二进制数按位取反.0000 0000 0001 0101 1111 1111 1110 1010左移运算符()将一个数的各二进制位全部左

19、移若干位将一个数的各二进制位全部左移若干位.必须为整数必须为整数.高位左移后溢出高位左移后溢出,舍弃不起作用舍弃不起作用.比如:比如:a=a2;如如a=15 0000 1111,左移左移2位后位后 0011 1100 a=60.左移中低位补左移中低位补0,高位溢出。,高位溢出。左移左移n位位,相当于该数乘以相当于该数乘以2的的n次幂次幂,但此结论只适但此结论只适用于该数左移时舍弃的高位中不包含用于该数左移时舍弃的高位中不包含1的情况的情况.a的值 a的二进制 a1 a)将一个数的各二进制位全部右移若干位.a2移到右端的低位舍去,对无符号数高位补0。如a=017;00001111a2则00000

20、01111在右移时,注意符号问题.对有符号数。符号位为0,高端仍补0。符号为1时,高端补0,为逻辑右移,高端补1为算术右移。a:1001011111101101a101001011111101101逻辑右移a111001011111101101算术右移(39)有以下程序#includemain()inta=2,b=2,c=2;printf(”%dn”,a/b&c);程序运行后的结果是CA)0B)1C)2D)3(39)若有以下程序段intr=8;printf(“%dn”,r1);输出结果是A)16B)8C)4D)2(39)有以下程序#includemain()inta=5,b=1,t;t=(a2|b);printf(“%dn”,t)程序运行后的输出结果是A)21B)11C)6D)1(39)有以下程序#includemain()chara=4;printf(%dn,a=a3;printf(%dn,c);程序运行后的输出结果是A)32B)16C)1D)0

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁