第六章模块化程序设计与C语言函数课件.ppt

上传人:小飞机 文档编号:2111237 上传时间:2023-01-12 格式:PPT 页数:66 大小:254.93KB
返回 下载 相关 举报
第六章模块化程序设计与C语言函数课件.ppt_第1页
第1页 / 共66页
第六章模块化程序设计与C语言函数课件.ppt_第2页
第2页 / 共66页
第六章模块化程序设计与C语言函数课件.ppt_第3页
第3页 / 共66页
第六章模块化程序设计与C语言函数课件.ppt_第4页
第4页 / 共66页
第六章模块化程序设计与C语言函数课件.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《第六章模块化程序设计与C语言函数课件.ppt》由会员分享,可在线阅读,更多相关《第六章模块化程序设计与C语言函数课件.ppt(66页珍藏版)》请在三一办公上搜索。

1、第六章 模块化程序设计与C语言函数,9/24/2022,第六章 模块化程序设计与C语言函数模块化程序设计基础1函数的,6.1.1 模块化程序设计1.模块化程序设计基本思想基本思想:将程序按功能分割成小模块。开发方法:FTTB,逐步分解,分而治之。特点和作用:模块独立,功能单一,结构清晰,接口简单。控制了程序设计的复杂性。提高模块元件的可靠性。缩短开发周期。避免程序开发的重复劳动。易于维护和功能扩充。FBTT方法与FTTB方法,6.1 模块化程序设计基础,9/24/2022,6.1.1 模块化程序设计6.1 模块化程序设计基础What,模块化程序设计的方法基础。特点:把复杂问题的求解过程分步骤进

2、行。面向目标。采取先全局、后局部的逐步分解思想。有利于将更多精力集中于较小模块的局部设计中。避免了盲目性。降低了系统设计与实现的整体工作量。,FTTB(From Top To Bottom),9/24/2022,模块化程序设计的方法基础。FTTB(From Top To,实践中:FBTT与FTTB结合来解决问题。在问题求解步骤和方法的确定上用FTTB方法,在将所有模块构成一个整体时用FBTT方法。,FBTT(From Bottom To Top),例6-1 以FTTB、逐步求精的模块化分解思想,分析1948年下半年解放战争战略决战问题。,P125-126,9/24/2022,实践中:FBTT与

3、FTTB结合来解决问题。在问题求解步骤和方,例6-2 求1+2+100的和。分析:问题可分为三个部分,对应三个模块:1)确定求值范围2)计算过程3)输出结果,给定求和的上界,计算i从1到给定上界的和,输出所求的和值,用选定方法求和,9/24/2022,例6-2 求1+2+100的和。给定求和的上界计算i从1,例6-3 分析九九乘法表输出功能。分析九九表的形状(例如第一种)。打印九行,每行分成两个部分:前导空格和九九表的口诀内容。,右上角九九表,输出九行,输出某行i,口诀构成:3*3 9(即i*j=i*j),输出第i行前导空格,输出第i行口诀,输出第i行的i-1个前导空格口诀,输出第i行第k个前

4、导空格口诀,输出第i行9-i+1个口诀,输出第i行第k个口诀,空格口诀与口诀字符结构相同,9/24/2022,例6-3 分析九九乘法表输出功能。右上角九九表输出九行输出,2.模块化程序的基本特征模块的IPO结构:要注意模块功能的独立性、完成功能所需的参数和提供给外界的输出信息。模块的接口问题:唯一的通信渠道。应保证接口的单入口和单出口特征。模块的功能问题:大小要合适;具有较强的独立性和相对简单性;内部实现方法也应按照结构化程序设计思想进行组织和设计。,9/24/2022,2.模块化程序的基本特征9/24/2022,6.1.2 C语言对模块化程序设计技术的支持,1.函数式程序语言结构,函数,带入

5、函数参数,带出计算结果,图6-6 C语言函数的基本结构,9/24/2022,6.1.2 C语言对模块化程序设计技术的支持1.函数式程序,float average(float fA,float fB,float fC)float fAve;fAve=(fA+fB+fC)/3;return fAve;/*End of average()*/,外部向内部传递信息,内部控制信息,由内部向外传递信息,1.允许进行模块内部及外部的信息交换,3.具有编译预能力以方便模块化调试和移植,9/24/2022,float average(float fA,float f,6.2.1 C 语言程序的组织结构,6.2

6、 函数的声明、定义和调用结构,9/24/2022,6.2.1 C 语言程序的组织结构6.2 函数的声明、定义和,6.2.2 函数声明与定义从用户角度分为:标准函数(库函数):由系统提供。用户自定义函数:由程序员提供。从函数形式上分为:无参函数有参函数,使用库函数应注意:1)函数完成的功能 2)参数数目和顺序及各参数意义和类型 3)返回值的意义和类型4)调用函数所需的包含文件(头文件),先声明、后定义、再引用,9/24/2022,6.2.2 函数声明与定义使用库函数应注意:先声明、后定义、,1.函数的声明(Function Declaration)声明的作用:告诉编译器函数类型、参数个数及类型,

7、以便进行类型检验,保证调用的数据传递的正确性。对被调用函数的要求:函数已经被定义,即函数存在对库函数,知道库的头文件.h对自定义函数,有函数类型声明函数声明(函数原型声明)的一般形式:函数类型 函数名(形参类型1 形参名1,形参类型n 形参名n);或 函数类型 函数名();,P129:函数的声明,形参数据类型和顺序很重要,必须要用分号结束,9/24/2022,1.函数的声明(Function Declaration),函数定义与函数声明不同函数声明的位置(P133)下列情况,可不作函数声明:对char或int型函数(隐含声明)函数的定义出现在主调函数之前有些系统要求函数声明指出函数返值和形参类

8、型,即使对void和int型函数也要进行函数说明(如Borland C+),P130-133,9/24/2022,函数定义与函数声明不同P130-1339/24/2022,一个完整形式的函数声明/*exam0604a.c:完整形式的函数声明*/#include int main(void)float fA=1,fB=2,fC=3;float sum(float fA,float fB,float fC);/*声明*/printf(sum=%fn,sum(fA,fB,fC);/*调用*/return 0;/*End of main()*/float sum(float fA,float fB,f

9、loat fC)/*定义*/return(fA+fB+fC);/*End of sum()*/,例6-4 函数声明实例。,声明了一个float型函数sum(),sum函数的定义,sum()函数有三个形式参数,观察函数的声明和定义的区别,9/24/2022,一个完整形式的函数声明例6-4 函数声明实例。声明了一个fl,允许声明与定义的参数名字不同#include/*exam0604b.c*/int main(void)float x=1,y=2,z=3;float sum(float x,float y,float z);/*声明参数名*/printf(sum=%fn,sum(x+y,y,z);

10、/*实参名*/return 0;/*End of main()*/float sum(float a,float b,float c)/*定义体参数名*/return(a+b+c);/*End of sum()*/,9/24/2022,允许声明与定义的参数名字不同9/24/2022,声明时可不给参数名,但类型要一一对应#include/*exam0604c.c*/int main(void)float x=1,y=2,z=3;float sum(float,float,float);/*声明*/printf(sum=%fn,sum(x,y,z);/*实参*/return 0;/*End of

11、main()*/float sum(float a,float b,float c)return(a+b+c);/*End of sum()*/,9/24/2022,声明时可不给参数名,但类型要一一对应9/24/2022,/*exam0604d.c*/#include int main(void)float x=1,y=2,z=3;float sum(int a,float b,float c);/*声明*/printf(sum=%fn,sum(x,y,z);/*调用*/return 0;/*End of main()*/float sum(float a,float b,float c)/*

12、定义*/return(a+b+c);/*End of sum()*/,类型不一致,出错信息:Type mismatch in redeclaration of sum,9/24/2022,/*exam0604d.c*/类型不一致出错信息:9/24/,/*定义时参数名不能省略*/#include int main(void)float x=1,y=2,z=3;float sum(float a,float b,float c);/*声明*/printf(sum=%fn,sum(x,y,z);/*调用*/return 0;/*End of main()*/float sum(float,float

13、,float)/*定义*/return(a+b+c);/*End of sum()*/,定义时省略了参数名,出错信息:Argument missing name in function sumUndefined symbol a in function sumUndefined symbol b in function sum Undefined symbol c in function sum,9/24/2022,/*定义时参数名不能省略*/定义时省略了参数名出错信息:9/,2.函数定义(Function Definition)是完成模块功能实现的主要工作。它对应一个分程序功能,也称为函数体

14、。定义一般格式:,合法标识符,函数类型 函数名(类型1 形参1,类型n 形参n)声明区域/*变量或函数等的声明*/执行语句区域/*可执行命令序列*/返回命令/*retrun*/,现代风格:,函数体,函数返回值类型。缺省时为int或void,9/24/2022,2.函数定义(Function Definition)合法,例 有参函数(现代风格)int max(int nX,int nY)int nZ;nZ=nXnY?nX:nY;return(nZ);/*End of max()*/,例 有参函数(现代风格)int max(int nX,nY)int nZ;nZ=nXnY?nX:nY;return

15、(nZ);/*End of max()*/,例 空函数dummy()/*End of dummy()*/,函数体为空,例 无参函数printStar()printf(*n);/*End of printStar()*/或printStar(void)printf(*n”);/*End of printStar()*/,9/24/2022,例 有参函数(现代风格)例 有参函数(现代风格)例 空函,函数类型 函数名(形参名1,形参名n)数据类型1 形参名1;数据类型n 形参名n;语句组,早期的函数定义经典方法,double sum(n1,n2,d1,d2)double d1,d2;int n1,n

16、2;return(n1+n2+d1+d2);/*End of sum()*/,函数类型,形参名列表,声明次序和现代格式的区别,9/24/2022,函数类型 函数名(形参名1,形参名n)早期的函数定义经典,#include float average(float val_1,float val_2,float val_3);int main(void)float x=1,y=2,z=3,q=4,t=5;float ave_1,ave_2;/*存放返回结果*/ave_1=average(x,y,z);printf(ave_1=%fn,ave_1);ave_2=average(x,q,t);prin

17、tf(ave_2=%fn,ave_2);return 0;/*End of main()*/float average(float val_1,float val_2,float val_3)float ave;ave=(val_1+val_2+val_3)/3.0;return ave;/*End of average()*/,文件包含编译预处理命令,函数声明,函数调用,函数调用,函数定义,9/24/2022,#include 文件包含编译预处理命令函,3.函数的返回值返回语句格式:return(表达式);或 return 表达式;或 return;功能:使控制从被调用函数返回到调用函数,同

18、时把返值带给调用函数。说明:一个函数可有多个return语句。若无return语句,遇函数的时,自动返回调用函数。若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换函数调用转换。void型函数。,例 无返回值函数。void swap(int x,int y)int temp;temp=x;x=y;y=temp;/*End of swap()*/,9/24/2022,3.函数的返回值例 无返回值函数。9/24/2022,printStar()printf(*);/*End of printStar*/int main(void)int nA;nA=printStar();p

19、rintf(%d,nA);/*End of main()*/,例 函数带回不确定值。,输出:*5,void printStar()printf(*);/*End of printStar*/int main(void)int nA;nA=printStar();printf(%d,nA);/*End of main()*/,编译错误!Error:Not an allowed type in function main,9/24/2022,printStar()例 函数带回不确定值。输出:*,例 函数返回值类型转换,#includeint max(float fA,float fB);int m

20、ain(void)float fA,fB;int nC;scanf(%f,%f,/*End of max()*/,返回值要自动转换成整型!,9/24/2022,例 函数返回值类型转换#include返回,6.2.3 函数的调用,参数是函数调用时的信息交换载体,其传递是函数调用过程的重要环节。C语言函数调用分为传值调用和传地址调用(第九章)两种。,1.函数的传值调用,调用方法:函数名(实参表)说明:实参与形参个数相等,类型一致,按顺序一一对应,9/24/2022,6.2.3 函数的调用 参数是函数调用时的信息,float sum(float fA,float fB,float fC)return

21、 sum;/*End of sum()*/函数的IO信息路径,9/24/2022,float sum(float fA,float fB,fl,注意函数参数求值顺序:,自右向左。,#includeint f(int nA,int nB);int main(void)int i=2,nP;nP=f(i,+i);printf(%d,%d,nP,i);return 0;/*End of main()*/int f(int nA,int nB)int nC;if(nAnB)nC=1;else if(nA=nB)nC=0;else nC=-1;return(nC);/*End of f()*/,运行结果

22、:0,3,#includeint f(int nA,int nB);int main(void)int i=2,nP;nP=f(i,i+);printf(%d,nP);return 0;/*End of main()*/int f(int nA,int nB)int nC;if(nAnB)nC=1;else if(nA=nB)nC=0;else nC=-1;return(nC);/*End of f()*/,运行结果:1,3,9/24/2022,注意函数参数求值顺序:自右向左。#includestdio,函数调用可以用于表达式,可以单独成为一个语句,也可以是其它函数的参数。因此,其调用形式有:

23、函数调用作为单独的语句 例 printStar();printf(Hello,World!n);函数调用用作表达式的运算成分 例 m=max(nA,nB)*2;函数调用作为其它函数的实参:例 printf(%d,max(nA,nB);m=max(nA,max(nB,nC);,9/24/2022,函数调用可以用于表达式,可以单独成为一个语句,也可以是其它函,形参与实参形参:定义函数时函数名后面括号中的变量名实参:调用函数时函数名后面括号中的表达式,例 比较两个数并输出大者。,#includeint max(int x,int y);int main(void)int a,b,c;scanf(%d

24、,%d,/*End of max()*/,形参,实参,9/24/2022,形参与实参c=max(a,b);main()max()int,说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在调用前不占内存;调用执行时为形参分配内存;调用结束,释放空间。其存储空间是不固定的且值是不可继承的实参是特定存储空间中的值,在调用期间值不会发生变化且存储空间相对固定,9/24/2022,说明:9/24/2022,例6-7 形参和实参的虚实结合实例。#include float average(float val_1,float va

25、l_2,float val_3)float ave;ave=(val_1+val_2+val_3)/3.0;return ave;/*End of average()*/int main(void)float x=1,y=2,z=3,q=4,t=5;float ave_1,ave_2;ave_1=average(x,y,z);printf(ave_1=%fn,ave_1);ave_2=average(x,q,t);printf(ave_2=%fn,ave_2);return 0;/*End of main()*/,1.000000,2.000000,3.000000,2.000000,1.00

26、0000,4.000000,5.000000,3.333333,9/24/2022,例6-7 形参和实参的虚实结合实例。654706547465,参数传递方式值传递方式:函数调用时为形参分配单元,并将实参值复制到形参中;调用结束时形参单元被释放,实参单元仍保留并维持原值值传递特点:形参与实参占用不同的内存单元。单向传递。,9/24/2022,参数传递方式9/24/2022,例6-8 交换两个数。,#include void swap(int a,int b);int main(void)int x=10,y=20;printf(x=%d,y=%dn,x,y);printf(swapped:n)

27、;swap(x,y);printf(x=%d,y=%dn,x,y);/*End of main()*/void swap(int a,int b)int temp;temp=a;a=b;b=temp;/*End of swap()*/,这里可以看:到x,y的值并没有发生变化,想要交换主函数中的变量x和y的值,该如何处理呢?,9/24/2022,1020 x:y:调用前:调用后:1020 x:y:例6-8,地址传递方式:函数调用时,将实参的存储地址作为参数值传递给形参的参数传递方式。实质上也是值传递,不过穿的是形参的地址值,而不是形参所在存储空间中的数据值。传地址值的特点:形参与实参占用(指向)

28、同样的存储单元“双向”传递实参和形参必须是地址,9/24/2022,地址传递方式:函数调用时,将实参的存储地址作为参数值传递给形,例 交换两个数,void swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;/*End of swap()*/int main(void)int x,y;scanf(%d,%d,/*End of main()*/,9/24/2022,例 交换两个数x59y调前:xp159y调swap:&x&,2.函数嵌套调用函数定义不可嵌套,但调用可以嵌套,main(),调用函数f1,return 0;,f1函数,f2函数,调用函数f2,9/

29、24/2022,2.函数嵌套调用main()调用函数f1return 0;,例6-10 计算一个数的绝对值平方根。float absoluteValue(float x);float squareRoot(float x);float absoluteValue(float x)if(x=epsilon)guessValue=(x/guessValue+guessValue)/2.0;return guessValue;/*End of square()*/int main(void)printf(SquareRoot(2.0)=%fn,squareRoot(2.0);return 0;/*E

30、nd of main()*/,main(),squareRoot(2.0),return 0;,squareRoot(),absoluteValue(),x=absoluteValue(x),guessValue=absoluteValue(x/guessValue+guessValue)/2.0),return guessValue;,return x;,return x;,9/24/2022,例6-10 计算一个数的绝对值平方根。main()squar,3.函数的递归调用*函数直接或间接调用自己的调用,int f(int nX)int nY,nZ;nZ=f(nY);.return(2*nZ

31、);,int f1(int nX)int nY,nZ;nZ=f2(nY);.return(2*nZ);,int f2(int nT)int nA,nC;nC=f1(nA);.return(3+nC);,说明C语言对递归函数的自调用次数没有限制每调用函数一次,系统将在内存堆栈区分配空间,用于存放函数变量、返回值等信息。所以递归次数过多可能引起堆栈溢出,9/24/2022,3.函数的递归调用*f()调f()调f2()调f1()f1,例6-11 直接递归求n的阶乘。,int fact(int num)if(num0)/*n0时继续求n!*/nTemp=fact(n);printf(The%d!=%d

32、n,n,nTemp);else printf(n must be greater than zero!n);return 0;/*End of main()*/,9/24/2022,例6-11 直接递归求n的阶乘。int fact(int n,int main(void)nTemp=fact(4);/*main()*/,int fact(4)if(num=1)return 1;else return 4*fact(3);/*fact()*/,int fact(3)if(num=1)return 1;else return 3*fact(2);/*fact()*/,int fact(1)if(n

33、um=1)return 1;else return 1*fact(0);/*fact()*/,int fact(2)if(num=1)return 1;else return 2*fact(1);/*fact()*/,2*1=2,3*2=6,4*6=24,nTemp=24,n=4时fact()的执行过程:,9/24/2022,int main(void)int fact(4)int,例6-12 间接递归求n的阶乘。,例6-13 Hanoi塔问题。,9/24/2022,例6-12 间接递归求n的阶乘。例6-13 Hanoi塔问题,6.3 变量的存储属性,变量属性研究的内容:可操作属性(数据类型属

34、性)存储属性(数据在存储空间的分配与有效性属性)可改变属性(值型变量还是指针型变量)访问属性(直接访问还是间接访问)可操作属性在第二章作过详细讨论,访问属性及值的可改变属性将在第九章讨论。,9/24/2022,6.3 变量的存储属性变量属性研究的内容:9/24/2022,6.3.1 变量的存储属性和可操作属性,由第二章的变量讨论知道,变量是对存放数据的存储空间及其值的一种抽象。变量声明、定义和使用的注意事项:,变量的存储数据类型问题。不同数据类型的存放格式各不相同,有效取值范围及能够进行的操作也有区别,它们是变量的操作属性;,变量的有效作用范围、所用存储器类别、有效作用时间段(生成周期)和存储

35、数据类别等构成了变量的存储属性内容。,引入,9/24/2022,6.3.1 变量的存储属性和可操作属性 由第二,C语言系统的内存映像,变量的4种存储属性类型说明修饰符,auto自动变量(动态变量),static静态变量,register寄存器变量(动态变量),extern外部变量,9/24/2022,C语言系统的内存映像堆栈区域(Stack)堆区域(Heap),int average(int n1,int n2,int n3)int nX,nY;int nX,nY;int nX,nY;int main(void)int nX,nY;,6.3.2 变量在语言程序代码中的位置属性,在函数内部出现,

36、在分程序中出现,在函数体外部出现,在main()函数中出现,函数参数,作为函数返回值,总结:局部变量参数变量全局变量外部变量,9/24/2022,int average(int n1,int n2,int,6.3.3 变量的生成周期及有效作用范围,按生存周期,临时变量,全程变量,局部的,全局的,局部的,1.临时存储变量及其有效作用范围,临时变量在程序执行时进行空间分配且局部有效,也称动态变量。特点:在执行的某一时刻动态建立,在另外一个时刻被动态撤销或回收。从位置上看,除了在函数体外声明外,没有static或extern修饰的都是临时变量。,例如:函数的形参变量、函数或分程序内部所声明的寄存器变

37、量和自动变量都属于动态变量。,9/24/2022,6.3.3 变量的生成周期及有效作用范围按生存周期临时变量,动态变量分为:自动变量和寄存器变量,自动变量声明格式如下:auto 数据类型 变量名=常量表达式,;auto修饰可有可无。函数体内部声明的变量、函数参数变量和其它分程序中声明的变量都属于自动变量。自动变量在程序段执行时临时建立和分配存储空间,离开时自动撤销以便资源被其他它序段重用。,自动变量在声明它的分程序中有效,9/24/2022,动态变量分为:自动变量和寄存器变量自动变量自动变量在声明它的,void prt(int n1,int n2)int nX,nY;printf(prts s

38、ource n1=%d n2=%dn,n1,n2);nX=n1+10,nY=n2+10;printf(prt()s nX=%d nY=%dn,nX,nY);n1+;n2+;printf(prt()s modified n1=%d n2=%dn,n1,n2);return;/*End of prt()*/int main(void)int nX=10,nY=20;printf(Before call:nX=%d nY=%dn,nX,nY);prt(nX,nY);printf(After call:nX=%d nY=%dn,nX,nY);return 0;/*End of main()*/,Bef

39、ore call:nX=10 nY=20prt()s source:n1=10 n2=20prt()s nX=20 nY=30prt()s modified n1=11 n2=21After call:nX=10 nY=20,prt()内的自动变量,main()内的自动变量,可见:main()中的nX,nY调用prt()前后的值未发生变化,例6-14 自动变量的局部有效性。,思考形参n1,n2和实参nX,nY值的变化情况,体会函数调用时值传递的特点,9/24/2022,void prt(int n1,int n2)Befor,例如:例14中main()的nX,nY及prt()中的nX,nY的存

40、储空间分布与同名屏蔽问题。,main()中的nX,nY变量的地址和值,prt()中的nX,nY变量地址和值,地址,地址,内、外层同名变量的自动屏蔽,值,值,自动变量在赋初值之前的值不确定,多次调用函数时,自动变量值不保留,9/24/2022,例如:例14中main()的nX,nY及prt()中的nX,例6-15 自动变量赋值之前的不确定性。int main(void)int num1,num2,num3;/*声明但不初始化*/float value1,value2;char ch;double dValue;printf(num1=%d num2=%d um3=%dn,num1,num2,nu

41、m3);printf(value1=%f value2=%fn,value1,value2);printf(dValue=%lfn,dValue);printf(ch=%cn,ch);return 0;/*End of main()*/,第三次运行结果:num1=-44 num2=27617 num3=-48value1=0.000000 value2=0.000000dValue=0.000000ch=,第一次运行结果:num1=104 num2=27 num3=-48value1=0.000000 value2=0.000000dValue=0.000000ch=,第二次运行结果:num1

42、=774 num2=0 num3=-48value1=0.000000 value2=0.000000dValue=0.000000ch=,可见:对整型自动变量在不给初始值时它是不确定的,9/24/2022,例6-15 自动变量赋值之前的不确定性。第三次运行结果:第一,例6-16 函数的多次调用之间自动变量没有继承性。#include/*自动变量继承性测试*/int inheritance_test(int num1,int num2)int nX,nY;/*nX,nY为观察对象*/printf(Before modified:nX=%d nY=%dn,nX,nY);nX=num1-num2;

43、nY=num1+num2;/*修正nX,nY*/printf(After modified:nX=%d nY=%dn,nX,nY);return 0;/*inheritance_test()*/int main(void)int i;for(i=1;i5;i+)inheritance_test(i*i,i+i);/*5次调用*/return 0;/*End of main()*/,Before modified:nX=1 nY=2444After modified:nX=-1 nY=3Before modified:nX=2 nY=2444After modified:nX=0 nY=8Bef

44、ore modified:nX=3 nY=2444After modified:nX=3 nY=15Before modified:nX=4 nY=2444After modified:nX=8 nY=24,结果分析:第一次调用后:nX=-1,nY=3;第二次调用计算赋值前,nX=2,nY=2444。它们与上次调用时最后计算结果完全不同,表明上次计算结果没有被保留下来。后续调用与此相似。nX和nY的随机性与具体编译器及执行环境有关。,9/24/2022,例6-16 函数的多次调用之间自动变量没有继承性。Befor,寄存器变量声明格式如下:register 数据类型 变量名=常量表达式,;以寄存

45、器方式存放,而不是主存储器。主要的优势是快,但寄存器数量资源有限。Register只能修饰局部变量和函数形参变量。,例6-16 寄存器变量实例。(P151),9/24/2022,寄存器变量例6-16 寄存器变量实例。(P151)9/24/,2.全程存储变量,全程变量(Gloabal(life period)Variable):变量所占存储空间在整个程序执行期间都有效程变量分为:静态全程变量和外部全程变量全程性与全局性的区别:全程性指的是变量的生存周期性或时间属性;全局性和局部性指的是变量在代码段中的有效作用范围或空间属性。,9/24/2022,2.全程存储变量全程变量(Gloabal(life

46、 pe,静态变量声明格式如下:static 数据类型 变量名=常量表达式,;在编译时分配空间,且在程序执行期间都不变。从执行开始直到整个程序结束。是函数或文件中的永久变量,分为静态局部变量和静态全局变量。声明在函数、分程序或文件内部的静态变量在外部不可见。但多次调用时值可以继承,以实现局部变量的继承性。必须初始化且用常量表达式。不显式初始化时,编译时的自动初始化的规定是:整型数据初值为0,浮点型数据值为0.0,字符数据为空格。,9/24/2022,静态变量9/24/2022,例6-18 静态局部变量和自动变量的可继承性对比。,#include int main(void)void increm

47、ent(void);increment();increment();increment();return 0;/*End of main()*/void increment(void)int n=0;/*auto*/n+;printf(n=%dn,n);return;/*End of increment()*/,#include int main(void)void increment(void);increment();increment();increment();return 0;/*End of main()*/void increment(void)static int n=0;/*

48、auto*/n+;printf(n=%dn,n);return;/*End of increment()*/,运行结果:n=1n=1n=1,运行结果:n=1n=2n=3,n无继承性,n有继承性,9/24/2022,例6-18 静态局部变量和自动变量的可继承性对比。#incl,例6-19 静态局部变量的隐式初始化。#include void prt(void)/*输出静态局部变量的值*/static int num;/*声明局部静态变量但不作显式初始化*/static float val;static char ch;static long lNum;static double dVal;sta

49、tic long unsigned luNum;printf(num=%d,val=%f,ch=%c,ch=%dn,num,val,ch,ch);printf(lNum=%ld,dVal=%lf,luNum=%lun,lNum,dVal,luNum);return;/*End of prt()*/int main(void)prt();return 0;/*End of main()*/,运行测试结果:num=0,val=0.000000,ch=,ch=0lNum=0,dVal=0.000000,luNum=0,注意:1)没有对静态局部变量显式初始化时,系统自行完成初始化。2)在主函数中引用p

50、rt()的静态变量时,编译器将提示“Undefined symbol of num in function main”错误。它表明prt()中的静态局部变量在分程序外部是不可见的,不能在外部进行引用。,9/24/2022,例6-19 静态局部变量的隐式初始化。运行测试结果:注意:1,例6-20 静态局部变量的有效作用范围测试。#include void prt(void)static int nX=1;printf(In prt()before nX+=2:nX=%dn,nX);nX+=2;printf(In prt()after nX+=2:nX=%dn,nX);return;/*End o

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号