第6章-函数与编.ppt

上传人:s****8 文档编号:67141115 上传时间:2022-12-23 格式:PPT 页数:59 大小:495.50KB
返回 下载 相关 举报
第6章-函数与编.ppt_第1页
第1页 / 共59页
第6章-函数与编.ppt_第2页
第2页 / 共59页
点击查看更多>>
资源描述

《第6章-函数与编.ppt》由会员分享,可在线阅读,更多相关《第6章-函数与编.ppt(59页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第6 6章章 函数与预处理命令函数与预处理命令江汉大学江汉大学 数计学院数计学院C C 语言程序设计语言程序设计1第第6章章 函数与预处理命令函数与预处理命令 6.1 概述概述6.2 函数的定义与调用函数的定义与调用6.3 函数的嵌套调用和递归调用函数的嵌套调用和递归调用6.4 局部变量和全局变量及其作用域局部变量和全局变量及其作用域6.5 变量的存储类别及变量的生存期变量的存储类别及变量的生存期6.6 编译预处理编译预处理26.1 概述概述 程序结构清晰,可读性好。程序结构清晰,可读性好。程序结构清晰,可读性好。程序结构清晰,可读性好。减少重复编码的工作量。减少重复编码的工作量。减少重复编

2、码的工作量。减少重复编码的工作量。可多人共同编制一个大程序,缩短程序可多人共同编制一个大程序,缩短程序可多人共同编制一个大程序,缩短程序可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。设计周期,提高程序设计和调试的效率。设计周期,提高程序设计和调试的效率。设计周期,提高程序设计和调试的效率。使用使用使用使用函数函数函数函数的的的的好处好处好处好处C程序程序源程序文件源程序文件n函数函数1函数函数m 源程序文件源程序文件1函数函数1函数函数n3【例例6.1】求一个整数的立方。求一个整数的立方。intint cube(cube(intint x)x)/*/*函数定义函数定义函

3、数定义函数定义*/return(x*x*x);return(x*x*x);main()main()intint f,a;f,a;printf(nEnterprintf(nEnter an integer number an integer number:););scanf(%dscanf(%d,&a);,&a);f=f=cube(a);cube(a);printf(%dprintf(%d*%d*%d=%dn,a,a,a,f);*%d*%d=%dn,a,a,a,f);程序运行情况如下:程序运行情况如下:Enter an integer number:2 2*2*2=8函数调用函数调用函数调用函数

4、调用程序的执行总是程序的执行总是从从main函数开始函数开始4 一个一个C C源程序源程序源程序源程序可以由可以由一个或多个源程序文件一个或多个源程序文件一个或多个源程序文件一个或多个源程序文件组组成。成。C编译系统在对编译系统在对C源程序进行编译时是以文件源程序进行编译时是以文件为单位进行的。为单位进行的。一个一个C C源程序文件源程序文件源程序文件源程序文件可以由可以由一个或多个函数一个或多个函数一个或多个函数一个或多个函数组成。组成。所有函数都是独立的。主函数可以调用其它函数,所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。其它函数可以相互调用。在一个在一个C程序中,有

5、且仅有一个主函数程序中,有且仅有一个主函数mainmain。C程序的执行总是从程序的执行总是从mainmain函数开始,调用其它函数函数开始,调用其它函数后最终回到后最终回到mainmain函数,在函数,在mainmain函数中结束整个程序函数中结束整个程序的运行。的运行。说明说明5 函数的种类函数的种类从函数定义形式分:从函数定义形式分:有参函数有参函数有参函数有参函数在主调(用)函数和被调在主调(用)函数和被调在主调(用)函数和被调在主调(用)函数和被调(用)函数之间通过参数(用)函数之间通过参数(用)函数之间通过参数(用)函数之间通过参数进行数据传递,进行数据传递,进行数据传递,进行数据

6、传递,如:如:如:如:intint cube(cube(intint x)x)无参函数无参函数无参函数无参函数如:如:如:如:getchargetchar()()在调用无参函数时,主调在调用无参函数时,主调在调用无参函数时,主调在调用无参函数时,主调函数不需要将数据传递给函数不需要将数据传递给函数不需要将数据传递给函数不需要将数据传递给无参函数。无参函数。无参函数。无参函数。从使用的角度看:从使用的角度看:从使用的角度看:从使用的角度看:标准函数(库函数)标准函数(库函数)标准函数(库函数)标准函数(库函数)库函数是由系统提供的。库函数是由系统提供的。库函数是由系统提供的。库函数是由系统提供的

7、。如:如:如:如:getchargetchar()()、sin(x)sin(x)等。等。等。等。在程序中可以直接调用它在程序中可以直接调用它在程序中可以直接调用它在程序中可以直接调用它们。附录们。附录们。附录们。附录A A列出了列出了列出了列出了C C的部的部的部的部分库函数。分库函数。分库函数。分库函数。用户自定义函数用户自定义函数用户自定义函数用户自定义函数如如如如:例例例例6.16.1中的中的中的中的cubecube函数。函数。函数。函数。6【例例6.2】无参函数的定义与调用。无参函数的定义与调用。void welcome()printf(*n);printf(Welcome to Ch

8、ina n);printf(*n);main()welcome();程序的输出结果如下:程序的输出结果如下:*Welcome to China*76.2.1 函数的定义函数的定义函数定义的一般形式函数定义的一般形式函数定义的一般形式函数定义的一般形式函数类型函数类型 函数名函数名(类型名类型名 形式参数形式参数1,)说明语句说明语句 执行语句执行语句 例如:求两个数的最大值。例如:求两个数的最大值。int max(int x,int y)int z;z=x y?x:y;return(z);类型省略时类型省略时类型省略时类型省略时默认为默认为默认为默认为intint类型类型类型类型有形式参数,有

9、形式参数,有形式参数,有形式参数,maxmax为为为为有参函数有参函数有参函数有参函数 8int max(x,y)int x,y;int z;z=x y?x:y;return(z);int max(x,y)int x,y;或或或或intint max(intmax(int x,y)x,y)或或int max(x,y)int x,y,z;z=x y?x:y;return(z);花括号中也可以为空,这种函数叫花括号中也可以为空,这种函数叫花括号中也可以为空,这种函数叫花括号中也可以为空,这种函数叫空函数空函数空函数空函数 。例如:例如:例如:例如:null()null()null()null()不

10、能在函数体内定义其他函数,即函数不能在函数体内定义其他函数,即函数不能在函数体内定义其他函数,即函数不能在函数体内定义其他函数,即函数不能嵌套定义不能嵌套定义不能嵌套定义不能嵌套定义。形参也可以这样定义形参也可以这样定义如下定义都是错误的如下定义都是错误的如下定义都是错误的如下定义都是错误的 9函数名(实参表列)函数名(实参表列)在在C语言中,把函数调用也作为一个表达式。语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数因此凡是表达式可以出现的地方都可以出现函数调用。例如:调用。例如:welcome();if(iabs(a)max)max=iabs(a);m=max

11、(c,max(a,b);6.2.2 函数的调用函数的调用函数调用的一般形式:函数调用的一般形式:10intint sum()sum()intint i,t=0;i,t=0;for(i=1;i=100;i+)for(i=1;i=100;i+)t+=i;t+=i;return(t);return(t);main()main()intint s;s;s=sum();s=sum();printf(%dnprintf(%dn,s);,s);程序输出结果:程序输出结果:5050intint sum(sum(intint x)x)intint i,t=0;i,t=0;for(i=1;i=x;i+)for(i

12、=1;i z=xy?x:yy?x:y;return(z);return(z);/*/*返回返回返回返回z z的值的值的值的值*/main()main()intint a,b,ca,b,c;scanf(%d,%d,&a,&bscanf(%d,%d,&a,&b););c=c=maxmax(a,b(a,b););printf(maxprintf(max is%is%dn,cdn,c););16函数的返回值是通过函数的返回值是通过函数的返回值是通过函数的返回值是通过returnreturn语句带回到主调函数的。语句带回到主调函数的。语句带回到主调函数的。语句带回到主调函数的。功能:功能:功能:功能:终

13、止函数的运行,返回主调函数,若有返终止函数的运行,返回主调函数,若有返终止函数的运行,返回主调函数,若有返终止函数的运行,返回主调函数,若有返回值,将返回值带回主调函数。回值,将返回值带回主调函数。回值,将返回值带回主调函数。回值,将返回值带回主调函数。说明:说明:说明:说明:若函数没有返回值,若函数没有返回值,若函数没有返回值,若函数没有返回值,returnreturn语句可以省略。语句可以省略。语句可以省略。语句可以省略。returnreturn语句中的表达式类型一般应和函数的类语句中的表达式类型一般应和函数的类语句中的表达式类型一般应和函数的类语句中的表达式类型一般应和函数的类型一致,型

14、一致,型一致,型一致,如果不一致,如果不一致,如果不一致,如果不一致,VCVC系统警告的同时自动将系统警告的同时自动将系统警告的同时自动将系统警告的同时自动将表达式类型转换为函数类型表达式类型转换为函数类型表达式类型转换为函数类型表达式类型转换为函数类型。函数的返回值函数的返回值return return 语句格式:语句格式:语句格式:语句格式:return return (表达式表达式表达式表达式);return return 表达式表达式表达式表达式;return;return;17【例例6.8】计算并输出圆的面积。计算并输出圆的面积。s(int r)return 3.14*r*r;mai

15、n()int r,area;scanf(%d,&r);printf(%dn,s(r);自动转换自动转换自动转换自动转换为为为为intintintint型型型型 思考:思考:若要得到单精度实型的圆面积,程序应如何修改若要得到单精度实型的圆面积,程序应如何修改程序运行情况如下:程序运行情况如下:2 1218 6.2.4 对被调函数的声明和函数原型对被调函数的声明和函数原型变量要变量要变量要变量要先定义后使用先定义后使用先定义后使用先定义后使用,函数也如此函数也如此函数也如此函数也如此。即。即。即。即被调函数的被调函数的被调函数的被调函数的定义要出现在主调函数的定定义要出现在主调函数的定定义要出现在

16、主调函数的定定义要出现在主调函数的定义之前义之前义之前义之前。如。如。如。如swapswapswapswap函数函数函数函数:允许整型函数(且参数允许整型函数(且参数允许整型函数(且参数允许整型函数(且参数也是整型)的定义出现在主也是整型)的定义出现在主也是整型)的定义出现在主也是整型)的定义出现在主调函数之后。如调函数之后。如调函数之后。如调函数之后。如maxmaxmaxmax函数函数函数函数:如果非整型函数在主调如果非整型函数在主调如果非整型函数在主调如果非整型函数在主调函数之后定义,则应在主调函数之后定义,则应在主调函数之后定义,则应在主调函数之后定义,则应在主调函数中或主调函数之前对函

17、数中或主调函数之前对函数中或主调函数之前对函数中或主调函数之前对被被被被调函数进行声明。调函数进行声明。调函数进行声明。调函数进行声明。void swap(int x,int y)main()swap(a,b);main()main()c=c=max(a,bmax(a,b););max(intmax(int x,x,intint y)y)19对被调用函数的说明对被调用函数的说明 如果使用库函数,应在文件开头用如果使用库函数,应在文件开头用#includeinclude命令将调用库函命令将调用库函数所需的信息包含到文件中来。数所需的信息包含到文件中来。如:如:#include include“s

18、tdio.hstdio.h”stdio.hstdio.h是是开开头头文文件件,其其中中存存放放了了I/OI/O库库函函数数所所用用到到的的一一些宏定义信息。些宏定义信息。#includeinclude“math.hmath.h”使用数学库函数应用这条命令。使用数学库函数应用这条命令。如如果果使使用用用用户户自自己己定定义义的的函函数数,一一般般应应在在主主调调函函数数中中对对被被调调用用函数作类型说明。函数作类型说明。main()main()float add(float x,float y);float add(float x,float y);float a,b,c;float a,b,c

19、;scanf(“%f,%f”,&a,&bscanf(“%f,%f”,&a,&b););c=add(a,b);c=add(a,b);printf(“sumprintf(“sum is%f”,c);is%f”,c);float add(float x,float y)float add(float x,float y)float z;float z;z=x+y;z=x+y;return(z);return(z);float add(float x,float y);20对被调函数进行声明的一般形式对被调函数进行声明的一般形式 函数类型函数类型函数类型函数类型 函数名(函数名(函数名(函数名(参数类

20、型参数类型参数类型参数类型1 1 1 1 参数名参数名参数名参数名1 1 1 1,);或或或或 函数类型函数类型函数类型函数类型 函数名(函数名(函数名(函数名(参数类型参数类型参数类型参数类型1 1 1 1,参数类型参数类型参数类型参数类型2 2 2 2,);思考思考思考思考:以下哪种情况需要以下哪种情况需要以下哪种情况需要以下哪种情况需要在主调函数中在主调函数中在主调函数中在主调函数中对被调函数对被调函数对被调函数对被调函数声明声明声明声明被调函数定义在前被调函数定义在前被调函数定义在前被调函数定义在前,主调函数定义在后主调函数定义在后主调函数定义在后主调函数定义在后。主调函数定义在前主调

21、函数定义在前主调函数定义在前主调函数定义在前,被调函数定义在后被调函数定义在后被调函数定义在后被调函数定义在后,且被调,且被调,且被调,且被调函数的类型不是整型的。函数的类型不是整型的。函数的类型不是整型的。函数的类型不是整型的。被调函数定义在后被调函数定义在后被调函数定义在后被调函数定义在后,但被调函数的类型是,但被调函数的类型是,但被调函数的类型是,但被调函数的类型是整型整型整型整型。第二种形式省略了参数名,此种形式也称为第二种形式省略了参数名,此种形式也称为函数的原型函数的原型。216.3 函数的嵌套调用和递归调用函数的嵌套调用和递归调用mainmain函数函数函数函数 调用函数调用函数

22、调用函数调用函数 A A;函数函数函数函数 A A 调用函数调用函数调用函数调用函数 B B;函数函数函数函数 B B 6.3.1 函数的嵌套调用函数的嵌套调用22【例例6.15】函数的嵌套调用函数的嵌套调用main()main()intint n=3;n=3;printfprintf(%dn,(%dn,sub1(n);sub1(n);sub1(int n)sub1(int n)intint i,ai,a=0;=0;for(i=n;i0;i-)for(i=n;i0;i-)a+=a+=sub2(i);sub2(i);return a;return a;sub2(int n)sub2(int n)

23、return n+1;return n+1;程序输出结果:程序输出结果:9 236.3.2 函数的递归调用函数的递归调用1 1递归的基本概念递归的基本概念递归的基本概念递归的基本概念递归调用递归调用递归调用递归调用:一个函数直接或间接地调用了它本身,:一个函数直接或间接地调用了它本身,就称为函数的递归调用。就称为函数的递归调用。递归函数递归函数递归函数递归函数:在函数体内调用该函数本身。:在函数体内调用该函数本身。int sub(int x)int y,z;if()z=sub(y);else return;例如:例如:直接调用直接调用sub函数本身函数本身242递归函数的执行过程递归函数的执行

24、过程【例例6.16】编一递归函数求编一递归函数求n!。思路思路:以求:以求4的阶乘为例的阶乘为例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。递归结束条件递归结束条件:当:当n=1或或n=0时,时,n!=1。递归公式:递归公式:n!=1 (n=0,1)n(n-1)!(n1)25程序如下:程序如下:float fact(float fact(intint n)n)float f=0;float f=0;if(nif(n0)0)printf(nprintf(n0,error!);0,error!);else if(n=0|n=1)else if(n=0|n=1)f=1;f=

25、1;else f=else f=fact(n-1)fact(n-1)*n;*n;return(f);return(f);main()int n;float y;printf(nInput n:);scanf(%d,&n);y=fact(n);printf(%d!=%-10.0fn,n,y);运行情况如下:运行情况如下:Input a integer number:4 4!=2426递归调用过程递归调用过程 回回 推推main()fact(4)fact(3)fact(2)fact(1)y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;return

26、 24 return 6 return 2 return 1 递递 推推 276.4 局部变量和全局变量及其作用域局部变量和全局变量及其作用域6.4.1 变量的作用域变量的作用域6.4.2 局部变量及其作用域局部变量及其作用域变量的作用域变量的作用域:变量在程序中可以被使用的范围。:变量在程序中可以被使用的范围。根据变量的作用域可以将变量分为根据变量的作用域可以将变量分为局部变量和全局局部变量和全局变量。变量。局部变量(局部变量(内部变量内部变量内部变量内部变量):在:在函数内函数内或或复合语句内复合语句内定定义的变量以及义的变量以及形参形参形参形参。作用域作用域:函数内或复合语句内。:函数内

27、或复合语句内。【例例6.19】分析下面程序的运行结果及变量的作用域。分析下面程序的运行结果及变量的作用域。问题:问题:问题:问题:一个变量在程序的每个函数中都能使用吗?一个变量在程序的每个函数中都能使用吗?一个变量在程序的每个函数中都能使用吗?一个变量在程序的每个函数中都能使用吗?28void void sub(intsub(int a a,int,int b b)intint c c;a=a=a+ba+b;b=;b=b+ab+a;c=b-a;c=b-a;printf(sub:taprintf(sub:ta=%d b=%d c=%=%d b=%d c=%dn,a,b,cdn,a,b,c););

28、局部变量局部变量局部变量局部变量main()int a=1,b=1,c=1;printf(main:ta=%d b=%d c=%dn,a,b,c);sub(a,b);printf(main:ta=%d b=%d c=%dn,a,b,c);int a=2,b=2;printf(comp:ta=%d b=%d c=%dn,a,b,c);printf(main:ta=%d b=%d c=%dn,a,b,c);局部变量局部变量局部变量局部变量局部变量局部变量局部变量局部变量程序输出结果:程序输出结果:main:a=1 b=1 c=1sub:a=2 b=3 c=1main:a=1 b=1 c=1comp

29、:a=2 b=2 c=1main:a=1 b=1 c=1296.4.3 全局变量及其作用域全局变量及其作用域全局变量全局变量(外部变量外部变量):在):在函数外部函数外部定义的定义的变量。变量。作用域作用域:从定义变量的位置开始到本源文件从定义变量的位置开始到本源文件结束结束。如在其作用域内的函数或分程序中定。如在其作用域内的函数或分程序中定义了同名局部变量,则在局部变量的作用域义了同名局部变量,则在局部变量的作用域内,同名全局变量暂时不起作用。内,同名全局变量暂时不起作用。【例例6.20】全局变量和局部变量的作用域。全局变量和局部变量的作用域。30intint a a=5;=5;void v

30、oid f(intf(int x x,intint y y)intint b,cb,c;b=b=a+xa+x;c=a-y;c=a-y;printf(%dt%dt%dn,a,b,cprintf(%dt%dt%dn,a,b,c););局部变量局部变量局部变量局部变量main()int b=6,c=7;f(b,c);printf(%dt%dt%dn,a,b,c);int a=9,b=8;printf(%dt%dt%dn,a,b,c);c=10;printf(%dt%dt%dn,a,b,c);printf(%dt%dt%dn,a,b,c);printf(%dt%dt%dn,a,b,c);局部变量局部变

31、量局部变量局部变量局部变量局部变量局部变量局部变量程序输出结果:程序输出结果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局变量全局变量316.5 变量的存储类别及变量的生存期变量的存储类别及变量的生存期6.5.1 6.5.1 变量的生存期与变量的存储分类变量的生存期与变量的存储分类变量的生存期与变量的存储分类变量的生存期与变量的存储分类变量的生存期变量的生存期:变量在内存中占据存储空间的时间。:变量在内存中占据存储空间的时间。思考思考思考思考:1.1.何时何时何时何时为变量分配内存单元为变量分配内存单元为变量分配内存单元为变量分配内存单元?2.2.将变量分配在内存

32、的什么将变量分配在内存的什么将变量分配在内存的什么将变量分配在内存的什么区域区域区域区域?3.3.变量占据内存的变量占据内存的变量占据内存的变量占据内存的时间时间时间时间(生存期生存期生存期生存期)?程序代码区静态存储区动态存储区动态存储区存储分配存储分配动态存储变动态存储变量量静态存储变量静态存储变量326.5.2 变量的存储类别变量的存储类别变量的属性数据类型:数据类型:数据类型:数据类型:决定为变量分配内存单元的长度;决定为变量分配内存单元的长度;决定为变量分配内存单元的长度;决定为变量分配内存单元的长度;数据的存放形式;数据的存放形式;数据的存放形式;数据的存放形式;数的范围。数的范围

33、。数的范围。数的范围。存储类别:存储类别:存储类别:存储类别:决定了变量的生存期;决定了变量的生存期;决定了变量的生存期;决定了变量的生存期;给它分配在哪个存储区。给它分配在哪个存储区。给它分配在哪个存储区。给它分配在哪个存储区。33变量定义语句的一般形式变量定义语句的一般形式存储类别存储类别存储类别存储类别 数据类型数据类型数据类型数据类型 变量名变量名变量名变量名1,1,变量名变量名变量名变量名n;n;autoauto(自动的)(自动的)(自动的)(自动的)registerregister(寄存器的)(寄存器的)(寄存器的)(寄存器的)staticstatic(静态的)(静态的)(静态的)

34、(静态的)externextern(外部的)(外部的)(外部的)(外部的)1 1自动变量(自动变量(自动变量(自动变量(autoauto类别)类别)类别)类别)局部变量可以定义为自动变量。局部变量可以定义为自动变量。局部变量可以定义为自动变量。局部变量可以定义为自动变量。main()int x,y;main()auto int x,y;自动变量自动变量自动变量自动变量等价等价可省可省可省可省34 内存分配内存分配内存分配内存分配调用函数或执行分程序时在调用函数或执行分程序时在调用函数或执行分程序时在调用函数或执行分程序时在动态存储区动态存储区动态存储区动态存储区为其分配存为其分配存为其分配存为

35、其分配存储单元,函数或分程序执行结束,所占内存空间即储单元,函数或分程序执行结束,所占内存空间即储单元,函数或分程序执行结束,所占内存空间即储单元,函数或分程序执行结束,所占内存空间即刻释放。刻释放。刻释放。刻释放。变量的初值变量的初值变量的初值变量的初值定义变量时若没赋初值,变量的定义变量时若没赋初值,变量的定义变量时若没赋初值,变量的定义变量时若没赋初值,变量的初值不确定初值不确定初值不确定初值不确定;如果;如果;如果;如果赋初值则每次函数被调用时执行一次赋值操作。赋初值则每次函数被调用时执行一次赋值操作。赋初值则每次函数被调用时执行一次赋值操作。赋初值则每次函数被调用时执行一次赋值操作。

36、生存期生存期生存期生存期 在函数或分程序执行期间。在函数或分程序执行期间。在函数或分程序执行期间。在函数或分程序执行期间。作用域作用域作用域作用域自动变量所在的函数内或分程序内。自动变量所在的函数内或分程序内。自动变量所在的函数内或分程序内。自动变量所在的函数内或分程序内。自动变量自动变量352静态变量(静态变量(static类别)类别)除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静除形参外,局部变量和全局变量都可以定义为静态变量。态变量。态变量。态变量。局部静态变量(或称内部静态变量)局部静态变量(或称内部静态变

37、量)局部静态变量(或称内部静态变量)局部静态变量(或称内部静态变量)全局静态变量(或称外部静态变量)全局静态变量(或称外部静态变量)静态变量静态变量静态变量静态变量静态变量静态变量静态变量静态变量static int a;main()float x,y;f()static int b b=1;全局静态变量全局静态变量局部静态变量局部静态变量局部静态变量局部静态变量自动变量自动变量自动变量自动变量不不不不能能能能省省省省36 内存分配内存分配内存分配内存分配编译时,将其分配在内存的静态存储区中,程序运编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。行结束释放该单元。静态变量的初值静

38、态变量的初值静态变量的初值静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为若定义时未赋初值,在编译时,系统自动赋初值为0 0;若定义时赋初值,则仅在编译时赋初值一次,;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值程序运行后不再给变量赋初值 。生存期生存期生存期生存期整个程序的执行期间。整个程序的执行期间。作用域作用域作用域作用域局部静态变量的作用域是它所在的函数或分程序。局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件全局静态变量的作用域是从定义处开始到本源文件结束。结束。静态变量静态变量37int c;static in

39、t a;main()float x,yx,y;char s;f()static int b b=1;3.外部变量(外部变量(extern类别)类别)在函数外定义的变量若没有用在函数外定义的变量若没有用在函数外定义的变量若没有用在函数外定义的变量若没有用 staticstatic说明,则是外说明,则是外说明,则是外说明,则是外部变量。外部变量只能部变量。外部变量只能部变量。外部变量只能部变量。外部变量只能隐式定义为隐式定义为隐式定义为隐式定义为externextern类别类别类别类别,不,不,不,不能显式定义。能显式定义。能显式定义。能显式定义。全局静态变量全局静态变量自动变量自动变量自动变量自

40、动变量局部静态变量局部静态变量局部静态变量局部静态变量外部变量外部变量38 内存分配内存分配内存分配内存分配编译时,将其分配在静态存储区,程序编译时,将其分配在静态存储区,程序编译时,将其分配在静态存储区,程序编译时,将其分配在静态存储区,程序运行结束释放该单元。运行结束释放该单元。运行结束释放该单元。运行结束释放该单元。变量的初值变量的初值变量的初值变量的初值若定义变量时未赋初值,在编译时,系若定义变量时未赋初值,在编译时,系若定义变量时未赋初值,在编译时,系若定义变量时未赋初值,在编译时,系统自动赋初值为统自动赋初值为统自动赋初值为统自动赋初值为0 0 0 0。生存期生存期生存期生存期整个

41、程序的执行期间。整个程序的执行期间。整个程序的执行期间。整个程序的执行期间。作用域作用域作用域作用域从定义处开始到本源文件结束。从定义处开始到本源文件结束。从定义处开始到本源文件结束。从定义处开始到本源文件结束。此外,还可以用此外,还可以用此外,还可以用此外,还可以用externexternexternextern进行声明,以使进行声明,以使进行声明,以使进行声明,以使其作用域扩大到该程序的其它文件中。其作用域扩大到该程序的其它文件中。其作用域扩大到该程序的其它文件中。其作用域扩大到该程序的其它文件中。外部变量外部变量问题:问题:问题:问题:全局静全局静全局静全局静态变量态变量态变量态变量的作

42、用的作用的作用的作用域可以域可以域可以域可以扩展到扩展到扩展到扩展到本程序本程序本程序本程序的其它的其它的其它的其它文件吗文件吗文件吗文件吗?39外部变量声明的一般格式外部变量声明的一般格式 externextern 数据类型数据类型数据类型数据类型 变量名变量名变量名变量名1 1,变量名,变量名,变量名,变量名n n;或或或或 externextern 变量名变量名变量名变量名1 1,变量名,变量名,变量名,变量名n n;注意:注意:外部变量声明用关键字外部变量声明用关键字externextern,而外部变量的,而外部变量的定义不能用定义不能用externextern,只能隐式定义。,只能隐

43、式定义。定义外部变量时,系统要给变量分配存储空间,定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。的外部变量,与函数声明的作用类似。40intint p=1,q=5;p=1,q=5;float f1(int a)float f1(int a)extern char extern char c1,c2;c1,c2;char c1,c2;char c1,c2;char f2(int char f2(int x,i

44、ntx,int y)y)main()main()外部变量声明外部变量声明定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量定义外部变量思考:思考:思考:思考:在在在在f1f1f1f1函数中声明函数中声明函数中声明函数中声明c1c1c1c1、c2c2c2c2的作用是什么?如何修改的作用是什么?如何修改的作用是什么?如何修改的作用是什么?如何修改程序使所有函数都可以使用程序使所有函数都可以使用程序使所有函数都可以使用程序使所有函数都可以使用外部变量而又不需要声明?外部变量而又不需要声明?外部变量而又不需要声明?外部变量而又不需要声明?【例例6.24】在一个文件内声

45、明外部变量。在一个文件内声明外部变量。41【例例例例6.256.25】在多文件的程序中声明外部变量。在多文件的程序中声明外部变量。在多文件的程序中声明外部变量。在多文件的程序中声明外部变量。file1.cfile1.c文件中程序如下:文件中程序如下:文件中程序如下:文件中程序如下:intint i;i;main()main()void f1(),f2(),f3();void f1(),f2(),f3();i=1;i=1;f1();f1();printf(tmainprintf(tmain:i=%:i=%d,id,i););f2();f2();printf(tmainprintf(tmain:i

46、=%:i=%d,id,i););f3();f3();printf(tmainprintf(tmain:i=%i=%dn,idn,i););void f1()void f1()i+;i+;printf(nf1:i=%printf(nf1:i=%d,id,i););file2.c文件中程序如下:文件中程序如下:extern int i;void f2()int i=3;printf(nf2:i=%d,i);void f3()i=3;printf(nf3:i=%d,i);程序输出结果:程序输出结果:f1:i=2 main:i=2f2:i=3 main:i=2f3:i=3 main:i=3声明外部变量

47、声明外部变量定义外部变量定义外部变量424.寄存器变量(寄存器变量(register类别)类别)只有只有只有只有函数内定义的变量或形参函数内定义的变量或形参函数内定义的变量或形参函数内定义的变量或形参可以定义为寄存器可以定义为寄存器可以定义为寄存器可以定义为寄存器变量。寄存器变量的值保存在变量。寄存器变量的值保存在变量。寄存器变量的值保存在变量。寄存器变量的值保存在CPUCPUCPUCPU的寄存器中。的寄存器中。的寄存器中。的寄存器中。受寄存器长度的限制,受寄存器长度的限制,受寄存器长度的限制,受寄存器长度的限制,寄存器变量只能是寄存器变量只能是寄存器变量只能是寄存器变量只能是charchar

48、charchar、intintintint和指针类型的变量。和指针类型的变量。和指针类型的变量。和指针类型的变量。【例例7.26】寄存器变量的使用。寄存器变量的使用。main()long int sum=0;register int i;for(i=1;i(Y)?(X):(Y)6.6 编译预处理(续)编译预处理(续)516.6 编译预处理(续)编译预处理(续)【例例例例6.306.30】带参数的宏定义。带参数的宏定义。带参数的宏定义。带参数的宏定义。#define#define MAX(x,yMAX(x,y)(x)(x)(y)?(x):(yy)?(x):(y)main()main()print

49、f(%dn,a,bprintf(%dn,a,b,MAX(a,bMAX(a,b););printf(%dn,printf(%dn,MAX(a+m,b+nMAX(a+m,b+n););分两次替换:分两次替换:将宏名将宏名MAX(a,bMAX(a,b)替换成字符串替换成字符串(x)(x)(y)?(x):(yy)?(x):(y)。用实参用实参a替换形参替换形参x,实参,实参b替换形参替换形参y。程序中的两个程序中的两个printf语句被展开为:语句被展开为:printf(%dn,(a)(b)?(a):(b);printf(%dn,(a+m)(b+n)?(a+m):(b+n);526.6 编译预处理(续

50、)编译预处理(续)【例例例例6.316.31】分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。分析下面程序运行后的输出结果。#define#define MA(xMA(x)x*(x-1)x*(x-1)main()main()intint a=1,b=2;a=1,b=2;printf(%dnprintf(%dn,MA(1+a+b)MA(1+a+b););分两次替换:分两次替换:MA(1+a+b)MA(1+a+b)用用x*(x-1)x*(x-1)替换。替换。用用1+a+b替换替换x。printf语句被展开为:语句被展开为:printf(%dn,1+a+b*

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

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

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com