对C语言的深入讨论

上传人:xy****7 文档编号:94165110 上传时间:2019-08-03 格式:PPT 页数:51 大小:182KB
返回 下载 相关 举报
对C语言的深入讨论_第1页
第1页 / 共51页
对C语言的深入讨论_第2页
第2页 / 共51页
对C语言的深入讨论_第3页
第3页 / 共51页
对C语言的深入讨论_第4页
第4页 / 共51页
对C语言的深入讨论_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《对C语言的深入讨论》由会员分享,可在线阅读,更多相关《对C语言的深入讨论(51页珍藏版)》请在金锄头文库上搜索。

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

2、)有以下程序 #include int f(int t ,int n); main() int a4=1,2,3,4,s; s=fa,4; printf(”%dn”,s); int f(int t, int n) if (n0) return tn-1+f(t,n-1); else return 0; 程序运行后的输出结果是B A)4 B)10 C)14 D)6,(15)有以下程序 #include fun(int x) if(x/20) fun(x/2); printf(“%d ”,x); main() fun(6);printf(“n”); 程序运行后的输出结果是 【15】,(32) 设有

3、如下函数定义 int fun(int k) if (k1) return 0; else if(k=1) return 1; else return fun(k-1) +1; 若执行调用语句:n=fun(3) ;,则函数fun总共被调用的次数是 A) 2 B) 3 C) 4 D) 5,编译预处理,一. 宏 1. 不带参数的宏 定义形式如下: #define 宏名 替换文本 或 #define 宏名 例13.4 #define PI 3.1415926,(1)宏名一般习惯用大写字母表示,以便与变量名相区别。这只是建议,宏名也可以使用小写字母。 (2)宏定义行的替换文本中还可以包含已经定义过的宏名

4、。 如:例13.5 #define PI 3.1415926 #define ADDPI (PI+1) #define TWO_ADDPI (2*ADDPI) (3)在宏展开时,C语言仅仅使用替换文本替换宏名,而不是使用计算的结果进行替换。 (4)宏定义时,如一行写不下,可以在行末尾加反斜线“”,然后在第二行接着再写。,(5)同一宏名不能重复定义,除非两个宏定义命令行完全一致。 (6)宏展开时,不能替换双引号中与宏名相同的字符串。 (7)宏定义的有效范围为定义点到文件结束,还可以用#undef提前终止已经定义的宏。,2. 带参数的宏,带参数的宏,即宏名后带有参数列表的宏定义为一个带参数的宏。在

5、进行宏展开时,用表达式替换该宏名,同时用实参代替宏名后的形参。 例13.6 #define MAX(x,y) (xy ? x:y) max=MAX(10,5); 宏展开后,赋值语句为:max=(105 ? 10:5);,对带形参的宏定义,说明如下:,(1)在替换带参数的宏名时,一对圆括号不能少,圆括号中实参的个数应该与形参的个数相同,如有多个参数,各参数用逗号隔开。 (2)与不带参数的宏相同,同一个宏名不能重复定义,除非两个宏定义命令行完全一致。 (3)在宏替换行的表达式中的形参和整个表达式应该用括号括起来。,例13.7 #define MUL(a,b) (a)*(b) m=MUL(10-5,

6、 5+1)/2; 结果输出m=_。 答案:15,(35)以下程序 #include #define SUB(a) (a)-(a) main() int a=2,b=3,c=5,d; d=SUB(a+b)*c; printf(”%dn”,d); 程序运行后的结果是 A)0 B)-12 C)-20 D)10,(35) 有以下程序 #include #define S(x) 4*(x) *x+1 main() int k=5,j=2; printf(“%dn“,S(k+j) ) ; 程序运行后的输出结果是 A) 197 B) 143 C) 33 D) 28,(35)有以下程序 #include #d

7、efine f(x) x*x*x main() int a=3,s,t; s=f(a+1);t=f(a+1); printf(“%d,%dn,s,t); 程序运行后的输出结果是 A) 10,64 B) 10,10 C) 64,10 D) 64,64,(36)有以下程序 #include #define PT 3.5; #define S(x) PT*x*x; mian() int a=1, b=2; printf(“%4.1fn”,S(a+b); 程序运行后输出的结果是 A)14.0 B)31.5 C)7.5 D)程序有错无输出结果,13.3 标识符的作用域,一. 存储分类 根据变量在内存的不

8、同位置,可以将变量分为两类:自动类和静态类。 根据程序中变量定义的位置不同,又可以将变量分为局部变量和全局变量。在函数外部定义的变量是全局变量。局部变量是内部变量,全局变量也称为外部变量。 局部变量可以是自动类变量,也可以是静态类变量。全局变量只能是静态类变量。,C语言提供了与此相关的4个关键字: auto(自动) register(寄存器) static(静态) extern(外部)。 如: int sum; auto int a,b,c; register int i; static float x,y;,二. 局部变量,局部变量有3种类型:auto、register和static。 1.

9、 auto变量 在定义变量时,如果没有指定相应的存储类型,则系统默认该存储类型为auto类型。当程序进入定义该变量的函数或复合语句时,系统为这些变量临时分配内存单元。当程序离开这个函数或复合语句时,系统将销毁这些内存单元,使其数据不再有效。,例13.9 以下程序的输出结果是_。 main() int i=1, i_sum; float f, f_sum; int i; i=10; printf(“(1)i=%dn”,i); printf(“(2)i=%dn”,i); 答案(1)i=10 (2)i=1,2. register变量,register变量(寄存器变量)与auto变量一样,是自动类变量

10、,其作用域和生存期与auto变量完全一样。register变量与auto变量唯一的区别是auto变量在内存中分配存储空间,而register变量在CPU的寄存器中分配。 寄存器运算速度非常的快,但寄存器数量有限,一般情况下,不建议编程人员使用寄存器变量。,3. static变量,在函数内部或复合函数语句中定义变量时,如果使用static来说明,就构成了静态局部变量。静态局部变量的作用域与auto和register类型变量一样,但其生存期却完全不一样。 静态局部变量在内存的静态存储区占据着永久性的存储单元,即使离开定义该变量的函数(或复合语句),该存储单元也不会被销毁。当下次再进行定义该变量的函

11、数(或复合语句)时,存储单元仍然保存着原来的值。,例13.10 以下程序运行后的输出结果是_。 fun(int a) int b=0; static int c=3; b+; c+; return (a+b+c); main() int i, a=5; for(i=0;i3;i+) printf(“ %d %d ”,i, fun(a); printf(“n”); 答案:0 10 1 11 2 12,全局变量外部变量 定义:在函数外定义,可为本文件所有函数共用 有效范围:从定义变量的位置开始到本文件结束,以及有extern说明的其它文件 外部变量可用存储类型:缺省 或 static,在外部任意位

12、置定义的变量,称为全局变量。全局变量都是静态变量,其作用域从定义的位置开始,到整个源文件结束为止。 例13.11 以下程序的运行结果是_。 int sum; int fun1() sum+=20; int a; int fun2() a=20; sum+=a; main() sum=0; fun1(); a=8; fun2(); printf(“sum=%d a=%d”, sum, a); 答案:sum=40 a=20,(34)有以下程序 #include int fun() static int x=1; x*=2; return x; main() int I,s=1; for (i=1;

13、i=2;i+) s=fun(); printf(”%dn”,s); 程序运行后的输出结果是 A)0 B)1 C) 4 D)8,(34)设函数中有整型变量n,为保证其在未赋值的情况下初值为0,应选择的存储类别是 A)auto B) register C)static D)auto或register,(34)有以下程序 #include int f(int n); main() int a=3,s; s=f(a);s=s+f(a);printf(“%dn”,s); int f(int n) static int a=1; n+=a+; return n; 程序运行以后的输出结果是 A)7 B)8

14、C)9 D)10,(34) 有以下程序 #include int fun() static int x=1; x*=2; return x; main() int i,s=1; for(i=1;i=3;i+) s*=fun() ; printf(“%dn“,s) ; 程序运行后的输出结果是 A) 0 B) 10 C) 30 D) 64,13.4 动态存储分配,一. malloc函数 malloc函数用于分配内存空间。ANSI C标准规定malloc函数返回值的类型为void*,该函数的调用形式为: malloc(size) 其中参数size的类型为unsigned int,表示需要分配的内存的

15、字节数。如果系统有足够的内存可供分配,函数返回一个指向有size个字节的存储区首地址,该首地址的基类型为void类型;若没有足够的内存单元可供分配,函数返回空值(NULL)。,例13.12 malloc函数的应用 int *p; float *q; p=(int*)malloc(4); q=(float*)malloc(4); if(p!=NULL) *p=6; If(q!=NULL) *q=3.8; ,动态分配存储单元,p,6,q,3.8,动态分配得到的内存单元没有名字,只能通过指针变量来引用它。一旦指针变量的值发生改变,原存储单元及所存数据都将无法再引用。通过调用malloc函数所分配的动态存储单元中没有确定的初值。 在调用malloc进行存储分配时,如果不能确定数据类型所占字节数,可以调用sizeof运算符来求得。如上例可以改为: p=(int *)malloc(sizeof(int); q=(float *)malloc(sizeof(float); 这是一种常用的方式,它由系统来计算数据类型的字节数。,二 . free函数,通过静态存储分配的变量和数组,在生存期后,或者程序运行结束后,所占用的存储单元会由系统自动释放。但是,动态存储分配的内存单元,必须由程序员手动进行释放。如果没有对其进行释放,则内存单元会一致

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

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号