第十、十一讲第6章函数、存储类和预处理程序b

上传人:M****1 文档编号:578931098 上传时间:2024-08-25 格式:PPT 页数:48 大小:196.52KB
返回 下载 相关 举报
第十、十一讲第6章函数、存储类和预处理程序b_第1页
第1页 / 共48页
第十、十一讲第6章函数、存储类和预处理程序b_第2页
第2页 / 共48页
第十、十一讲第6章函数、存储类和预处理程序b_第3页
第3页 / 共48页
第十、十一讲第6章函数、存储类和预处理程序b_第4页
第4页 / 共48页
第十、十一讲第6章函数、存储类和预处理程序b_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《第十、十一讲第6章函数、存储类和预处理程序b》由会员分享,可在线阅读,更多相关《第十、十一讲第6章函数、存储类和预处理程序b(48页珍藏版)》请在金锄头文库上搜索。

1、6.2.1 问题的提出6.2.2 auto变量6.2 6.2 变量的作用域与生命期变量的作用域与生命期6.2.3 extem变量6.2.4 static变量6.2.5 register变量6.2.6 存储类别小结第第章章6 6函数、存储类和预处理程序函数、存储类和预处理程序【例例6.10】i的输出值是多少?的输出值是多少?#includevoidf()inti;i=3;main()inti=0;f();i+=5;printf(”i=%d”,i);6.2.1问题的提出问题的提出【例例6.10】i的输出值是多少?的输出值是多少?#includevoidf()inti;i=3;main()inti=

2、0;f();i+=5;printf(”i=%d”,i);6.2.1问题的提出问题的提出考虑两个问题:考虑两个问题:(1)函数)函数f中语句中语句i=3;中的中的i与与main中的中的i是是同一个变量?同一个变量?(2)函数调用结束后)函数调用结束后f中的中的i值依然存在?值依然存在?这两个条件均不成立,这两个条件均不成立,i的值为的值为5概述概述C语言说明变量是给出两方面信息:语言说明变量是给出两方面信息:数据类型和存储类别。数据类型和存储类别。数据类型,是变量的数据类型,是变量的操作属性。存储属性反映了变量的如下一些操作属性。存储属性反映了变量的如下一些特性:特性:(1 1)变量的存储器类型

3、)变量的存储器类型程序中的变量是存储在内存储器中的。实际程序中的变量是存储在内存储器中的。实际上,除上,除主存主存与与辅存辅存外,外,CPU中还有一个小中还有一个小小的临时存储器称为小的临时存储器称为寄存器寄存器,用以存储一些,用以存储一些反复被加工的数据,寄存器的存取速度比主反复被加工的数据,寄存器的存取速度比主存快。存快。C语言允许程序员区分是在主存(主存的数据区分两个部分:静态存储区和动态存储区)中还是在寄存器中开辟变量存储空间。(2 2)变量的生命期:变量占据内存的时间期)变量的生命期:变量占据内存的时间期限限. .静态变量:静态变量:静态变量存储空间在程序的整个运静态变量存储空间在程

4、序的整个运行期间是固定的。一个变量被指定为静态,在行期间是固定的。一个变量被指定为静态,在编译时分配存储空间,程序一开始执行便被建编译时分配存储空间,程序一开始执行便被建立,直到该程序执行结束都是存在的。立,直到该程序执行结束都是存在的。动态变量:动态变量:动态变量是在程序执行当中被动态动态变量是在程序执行当中被动态建立、动态撤销的,仅存在于函数被调用期间。建立、动态撤销的,仅存在于函数被调用期间。(3 3)变量的作用域:变量出现的有效区域)变量的作用域:变量出现的有效区域局部变量:局部范围内有效局部变量:局部范围内有效全局变量:从定义的位置开始到本文件的全局变量:从定义的位置开始到本文件的结

5、束结束.变变量量的的存存储储类类别别决决定定了了变变量量的的作作用用域域和和生命期,变量的存储类别共有四种:生命期,变量的存储类别共有四种:自动型自动型(auto)(auto)外部型外部型(extern)(extern)静态型静态型(static)(static)寄存器型寄存器型(register)(register)自动变量和寄存器变量属于动态存储自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于方式,外部变量和静态内部变量属于静态存储方式。静态存储方式。1.自自动动型型(auto)变变量量是变量被说明时,存储类信息可以缺省的,并且变量的说明出现在函数内部,这样的变量的存储类别

6、就是自自动型动型。int f(int a) auto int b,c; float d,e; : : 复复合合语语句句(Block)也也可可出出现现变变量量说说明明,当当缺缺省省存储类别信息时,就属于自动型变量。存储类别信息时,就属于自动型变量。main()inta,b,c;:floatd,e;/*存储类别是隐式说明,存储类别是隐式说明,即存储类别是自动型即存储类别是自动型*/: 自自动动型型变变量量一一旦旦说说明明只只能能在在说说明明该该变变量量的的函函数数或或复复合合语语句句中中出出现现才才算算有有效效。离离开开了了上上述述区区域域,对对该该变变量量的的引引用用是是无无效效的的,不不合合法

7、的。法的。doublefun1(doublep1)intp2,p3;:p1,p2,p3的有效区的有效区域域:Charfun2(charp4)charp5,p6;:p4,p5,p6的有效区的有效区域域:形参(自动型)形参(自动型)隐式说明的自动型隐式说明的自动型 main()floatx,y;:inta,b;:a,b的有效区域的有效区域:x,y的有效区域的有效区域: 内部变量和外部变量内部变量和外部变量 变量说明的位置不同,其作用域也不同,变量说明的位置不同,其作用域也不同,据此将语言中的变量分为内部变量和外据此将语言中的变量分为内部变量和外部变量。部变量。内部变量:内部变量:在一个函数内部说明

8、的变量是内在一个函数内部说明的变量是内部变量,它只在该函数范围内有效。也就是部变量,它只在该函数范围内有效。也就是说,只有在包含变量说明的函数内部,才能说,只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使使用被说明的变量,在此函数之外就不能使用这些变量了。所以内部变量也称用这些变量了。所以内部变量也称“局部变局部变量量”。例如:例如:intf1(inta)/*函数函数f1*/intb,c;/*a,b,c作用域:仅限于函数作用域:仅限于函数f1()中中*/intf2(intx)/*函数函数f2*/inty,z;/*x,y,z作用域:仅限于函数作用域:仅限于函数f2()中中

9、*/main()intm,n;/*m,n作用域:仅限于函数作用域:仅限于函数main()中中*/关于局部变量的作用域还要说明以下几点:关于局部变量的作用域还要说明以下几点:1主函数主函数main()中定义的内部变量,也只能中定义的内部变量,也只能在主函数中使用,其它函数不能使用。同时,在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的内部主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与其它函变量。因为主函数也是一个函数,与其它函数是平行关系。这一点是与其它语言不同的,数是平行关系。这一点是与其它语言不同的,应予以注意。应予以注意。2形参变量也是内部

10、变量,属于被调用函数。形参变量也是内部变量,属于被调用函数。3允许在不同的函数中使用相同的变量名,允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。互不干扰,也不会发生混淆。4在复合语句中也可定义变量,其作用域只在复合语句中也可定义变量,其作用域只在复合语句范围内。在复合语句范围内。2.外外部部(externextern)变变量量是是指指,在在一一个个函函数数中中合合法法出出现现的的同同时时,又又可可以以在在其其它函数中合法出现。它函数中合法出现。inta,b;voidf()a+=2;b+=3;:main()a

11、=1;b=2;:f();:/*a,b是外部变量是外部变量*/它们既可以在函数它们既可以在函数f中合法出现,又可以中合法出现,又可以在函数在函数main中合法出现。中合法出现。 外部变量的说明也可出现在函数的内部,例如:外部变量的说明也可出现在函数的内部,例如: intint b,cb,c; ; /*/*b,cb,c是外部变量是外部变量 * */ / intint f(intf(int a) a) extern extern intint d,e; d,e; /*d,e/*d,e是外部变量是外部变量 * */ / d=e=3; d=e=3; : : intint d,e; d,e; main(

12、) main( ) : : 如果定义点之前的函数需要引用这些外如果定义点之前的函数需要引用这些外部变量时,需要在函数内对被引用的外部变部变量时,需要在函数内对被引用的外部变量进行量进行说明说明。(不带存储类别的外部变量说。(不带存储类别的外部变量说明称为变量的定义性说明,带存储类别的外明称为变量的定义性说明,带存储类别的外部变量说明称为变量的引用性说明)部变量说明称为变量的引用性说明)外部变量引用性说明的一般形式为:外部变量引用性说明的一般形式为:extern数据类型数据类型外部变量外部变量,外部变量,外部变量2;externintd,e;注意注意:外部变量的定义性说明和外部变量的:外部变量的

13、定义性说明和外部变量的引用性说明是两回事。引用性说明是两回事。外部变量的定义性外部变量的定义性说明必须在所有的函数之外,且只能定义说明必须在所有的函数之外,且只能定义一次一次。而外部变量的引用性说明,出现在。而外部变量的引用性说明,出现在要使用该外部变量的函数内,而且可以出要使用该外部变量的函数内,而且可以出现多次。现多次。外外部部变变量量的的作作用用域域是是从从其其出出现现的的位位置置直直至至程序正文结束。程序正文结束。 externextern变量的生命期是整个程序执行期。变量的生命期是整个程序执行期。 外外部部变变量量作作用用是是为为了了在在函函数数与与函函数数之之间间,文文件件与与文文

14、件件之之间间进进行行通通信信,即即外外部部变变量量起起“全局变量全局变量”的作用。的作用。3.静态静态(static)变量变量生命周期:整个程序的执行过程生命周期:整个程序的执行过程有效范围:函数或文件内部有效范围:函数或文件内部外部静态变量(静态全局变量)外部静态变量(静态全局变量)内部静态变量(静态局部变量)内部静态变量(静态局部变量) 【例例6.12】求求15的阶乘。的阶乘。 #includelongfactor(intn)staticintf=1;f=f*n;returnf;main()longi;for(i=1;i=5;i+)printf(%dn,factor(i); 说明:说明:静

15、态变量可出现在程序正文的任何位置,必须静态变量可出现在程序正文的任何位置,必须用用static显式显式地加以说明。它既可出现在函地加以说明。它既可出现在函数内部,又可以出现在函数外部。数内部,又可以出现在函数外部。内内部部静静态态变变量量初初始始化化语语句句只只有有在在第第一一次次调调用用该该函数时才执行。函数时才执行。内内部部静静态态变变量量的的作作用用域域仅仅局局限限于于该该函函数数内内;外外部部静静态态变变量量作作用用域域为为文文件件内内部部;静静态态变变量量的的生生命期是整个程序的执行过程。命期是整个程序的执行过程。内部静态变量只能在函数内部改变该变量的值内部静态变量只能在函数内部改变

16、该变量的值4.4.寄寄存存器器(register)(register)变变量量只只能能出出现现在在函函数数内部,必须用关键词内部,必须用关键词registerregister。【例例6.136.13】 寄存器变量实例。寄存器变量实例。 #include #include long factor ( long factor (intint n ) n ) register register intint i i; ; long r; long r; for (i=1,r=1;i=n;i+) for (i=1,r=1;i=n;i+) r*=i; r*=i; main() main() : : 一般

17、情况下,变量的值都是存储在内存中的。一般情况下,变量的值都是存储在内存中的。为提高执行效率,语言允许将局部变量的为提高执行效率,语言允许将局部变量的值存放到寄存器中,这种变量就称为寄存器值存放到寄存器中,这种变量就称为寄存器变量。变量。 (1 1)只有局部变量才能定义成寄存器变量,)只有局部变量才能定义成寄存器变量,即全局变量不行。即全局变量不行。(2 2)对寄存器变量的实际处理,随系统而异。)对寄存器变量的实际处理,随系统而异。例如,微机上的例如,微机上的MSCMSC和和TCTC将寄存器变将寄存器变 量实际当作自动变量处理。量实际当作自动变量处理。(3 3)允许使用的寄存器数目是有限的,不能

18、)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。定义任意多个寄存器变量。存储存储类别类别自动型自动型外部型外部型静态型静态型寄存器型寄存器型出现出现范围范围函数内部函数内部任何可出现说任何可出现说明部分的位置明部分的位置函数内部函数内部函数内部函数内部判别判别方法方法(1)显式示出现显式示出现auto(2)在函数内部在函数内部(包括(包括main)中缺中缺省存储类别说明的省存储类别说明的变量变量(1)显式出现显式出现extern(2)在函数外在函数外部缺省存储类部缺省存储类别说明的变量别说明的变量显式出现显式出现static显式出现显式出现register作用作用域域说明该变量的函

19、数说明该变量的函数或复合语句或复合语句出现说明的位出现说明的位置开始到程序置开始到程序正文结束正文结束说明该变说明该变量的函数量的函数内内说明该变说明该变量的函数量的函数内内生命生命期期说明该变量的函数说明该变量的函数被调用时被调用时整个程序执行整个程序执行期期整个程序整个程序执行期执行期说明该变说明该变量的函数量的函数被调用时被调用时 【例例6.14】写出下列程序的输出结果。写出下列程序的输出结果。 #includeintx=1,y=2;f(intx,inty)intz=2;z=x+y;returnz;main()intx=3,w;w=f(x,y);printf(”%d”,w);外部变量外部

20、变量x,y 自动变量自动变量x,y,z的作用范围的作用范围自动变量自动变量x,w的作用范围的作用范围外部变量外部变量y作用范围作用范围在同一个源程序中若全程在同一个源程序中若全程变量与自动变量同名,则变量与自动变量同名,则在自动变量的作用域内,在自动变量的作用域内,全程变量不起作用全程变量不起作用。6.3.1 6.3.1 文件包含文件包含6.3.2 6.3.2 宏替换宏替换6.3 6.3 预处理程序预处理程序6.3.3 6.3.3 条件编译条件编译预处理概述符号 “#”位置 源程序前面功能 便于程序的阅读、修改、移植、调 试,和模块化程序设计6.3.1文件包含文件包含一、一、一、一、 概念概念

21、概念概念(1 1)文件包含的含义和功能)文件包含的含义和功能)文件包含的含义和功能)文件包含的含义和功能(2)文件包含的形式)文件包含的形式#include“文件名文件名”或或双引号或尖括号的区别:双引号或尖括号的区别:用用双双引引号号:先先在在引引用用被被包包含含文文件件的的C源源程程序序所所在在的的文文件件目目录录中中寻寻找找,若若找找不不到到,再再按按系系统统指指定定的的标标准准方方式式寻寻找其它目录;找其它目录;用尖括号用尖括号:则仅查找按系统标准方式指定的目录。则仅查找按系统标准方式指定的目录。通常采用双引号比较保险(自定义文件只能用通常采用双引号比较保险(自定义文件只能用“”)。)

22、。二 注意 *一个include命令只能指定一个文件 *被包含文件和所在文件成为一个文件注意 被包含文件中定义的全局变量 *文件包含可以嵌套File1.cint min1(int a,int b) if(ab) return (b); else return (a);File2.cInt min2(int a,int b,intc) int z,m;Z=min1(a,b);M=min1(z,c);return (m);#include #include “file1.c”#include “flie2.c”main()int x1,x2,x3,min; scanf(“%d,%d,%d”,&x1

23、,&x2,&x3);min=min2(x1,x2,x3);printf(“min=%dn”,min); 6.3.2 宏替换什么是宏?宏名?宏展开(宏替换)?#include#definePI3.1416main()floatr;doublep,s;scanf(“%f”,&r);p=2*PI*r;s=PI*r*r;printf(“p=%fn”,p);printf(“s=%fn”,s);宏替换宏替换分为不带参数和带参数两种。宏替换分为不带参数和带参数两种。宏替换的作用范围是定义它的源文件。的作用范围是定义它的源文件。一、不带参数的宏替换一、不带参数的宏替换形式:形式:#define例如例如#def

24、inePI3.1416#defineM(y*y+3*y)说明:说明:& &宏名用大写字母宏名用大写字母 & &使用宏替换的作用使用宏替换的作用 & &宏扩展仅仅是简单的字符替换不检查语法宏扩展仅仅是简单的字符替换不检查语法 & &宏定义后不加宏定义后不加“ ;” & &宏替换的范围宏替换的范围 & &宏定义中可以引用以定义的宏名宏定义中可以引用以定义的宏名 & &宏替换不替换双引号括起来的字符串宏替换不替换双引号括起来的字符串二、带参数的宏替换二、带参数的宏替换形式形式#define(宏名宏名)(形参表形参表)(字符串字符串)例例#definesquare(x)x*x则,则,square(5)

25、将被替换为将被替换为5*5.思考:思考:square(a+b)=?若若#definesquare(x)(x)*(x)square(a+b)=?例 #define MAX(a,b) (ab)?a:b main() int m,n,max; printf(“input two numbers: ”); scanf(“%d%d”,&m,&n); max=MAX(m,n); printf(“max=%dn”,max); 说明:宏名和形参表间不能出现空格 思考:#define MAX (a,b) (ab)?a:b printf(“max=%dn”,max);宏形参的数据类型(和函数的区间)宏定义中的形参

26、只是标识符,而宏调用中的形参可以是表达式宏定义中字符串中的形参般都用括号括起来 思考 #define SQ(y) y*y sq=SQ(a+1) sq=160/SQ(a+1) sq得到什么结果?函数和带参数的宏比较函数值传递 宏仅为字符的替换函数调用时给形参分配空间,而宏调用在预编译时完成不分配空间函数中形参的类型要定义,宏形参不定义类型函数调用占有程序运行时间,而宏调用占编译时间6.3.3条件编译 是对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件。 条件编译指令有以下三种形式: (1)# ifdef # else #endif功能:当“标识符”已经被#define

27、命令定义过,则编译程序段1,否则编译程序段2。(2)#ifndef (2)#ifndef 1 # else # else 2 # #endifendif(3)# if (3)# if 1 #else #else 2 # #endifendif格式与格式与#ifdef#endif命令一样,命令一样,功能正好与之相反。功能正好与之相反。当表达式为非当表达式为非0(“逻辑真逻辑真”)时,编译程序段时,编译程序段1,否则编译,否则编译程序段程序段2。数值转换#include stdio.hvoid main() int m,n,k,a5,i=0,j=0; a5=(0,0,0,0,0,0);char t

28、;printf(shurushuju:); scanf(%d,&n);while (n)m=n%16;if(m9)ai=m+55;else ai=m;i+; n=n/16;j+; for(i=j-1;i=0;i-) if(ai9)printf(%c,ai);elseprintf(%d,ai); 用函数求因子#include stdio.hvoid yinzi(int);main() int m;printf(shurushuju: );scanf(%d,&m);yinzi(m);void yinzi(int m)int n;for(n=1;nm;n+)if (m%n=0)printf(%4d,n);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

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