1、大,2,#,C+,+,语言程,序,设,计,第,九,讲,函,数,、递推、递归,1,大连理,工大学,盘锦校,区基础教学部,7/15/2025,第,九讲,函数,、,递推,、,递归,递推,递,推,是,计,算机数,值,计算中,的,一个重,要,算法。,大,2,思,路,:,通,过数学,推,导,将,复,杂的运,算,化解为,若,干重复,的,简,单,运,算,以,充,分发挥,计,算机长,于,重复运,算,的特点;,递,推,法,特,点,:,从,一,个已知,的,事实出,发,,按一,定,规律推,出,下,一,个,事实,,再,从这个,新,的已知,事,实出发,,,再向下,推,出,一,个,新的事,实,。,7/15/2025,第,
2、九讲,函数,、,递推,、,递归,递推举例(,1,),大,3,例,:,(,猴,子,吃桃问,题,),猴子,第,1,天,摘,下,若,干桃子,,,当即吃,了,一半,,还,不过瘾,,又,多吃了,一,个。,第,2,天,早,上,又,将剩下,的,桃子吃,掉,一半,,又,多吃了,一,个。以,后,每天早,上,都吃了,前,一天剩,下,的一,半,另加一,个,。到,第,1,0,天早上,想,再吃时,,,就只剩,下,一个,桃,子了。,问,第,1,天,猴,子共摘,了,多少桃,子,?,7/15/2025,第,九讲,函数,、,递推,、,递归,解,题思路,:,大,4,假,设,用,S,(,i)表示第,i天没吃之前的桃子数目;,则,S
3、1),即为第,1天所摘的桃子数;,S(10)=S(9)*1/2,1第10 天没吃之前的桃子数,S(2),=,S(1),*1/2,1,第,2,天没吃之前的桃子数,S(3),=,S(2),*1/2,-1,第,3,天没吃之前的桃子数,S(9),=,S(8),*1/2,-,1,第,9,天没吃之前的桃子数,7/15/2025,第,九讲,函数,、,递推,、,递归,一,般形,式,:,S,(i),=,S,(,i-1),*,1,/,2,1,大,5,i,=,2,3,10;,这,个,公式可用,于,知,第,1,天没吃之前的桃子数推算,第,2,天,没吃之前,的,,再推算,第,3,天没吃之前,的,,,.,。现在要求,的
4、是,第,1,天没吃之前,的,。能否倒过来,先,知,第,1,0,天没吃之前的 的再,反,推,第,9,天没吃之,的,,,,,直到,第,1,天没吃之前,的,。为 此将上式改写,为:,S(,i,-1)=,2*,(,S,(,i)+1),i=,10,9,8,2,7/15/2025,第,九讲,函数,、,递推,、,递归,程,序:,大连理,工大学,盘锦校,区基础教学部,6,6,大连理,工大学,盘锦校,区基础教学部,7/15/2025,第,九讲,函数,、,递推,、,递归,分析:,一般形式,:,S(,i,-1)=,2*,(,S,(,i)+1),i=,10,9,8,2,;,初始:,s2=1;/,S(10)=,1,大,
5、7,i,=9,s1=2*(s2,+1);,s2=s1;,s1=2*(s2,+1);,s2=s1;,s1=2*(s2,+1);,s2=s1;,/,S(9)=,2*(S(10)+1),/s2=s1=,S,(9),/,S(8)=,2*(S(9)+1),/s2=s1=S(8),/,S(7)=,2*(S(8)+,1),/s2=s1=,S,(7),i,=8,i,=7,i,=6,s1=2*(s2,+1);,s2=s1;,/,S(6)=,2*(S(7)+1),/s2=s1=,S,(6),7/15/2025,第,九讲,函数,、,递推,、,递归,i,=,5,大,8,s1=2*(s2,+1);,s2=s1;,/,S
6、5)=,2*(S(6)+1),/s2=s1=,S,(5),/,S(4)=,2*(S(5)+1),/s2=s1=,S,(4),/,S(3)=,2*(S(4)+1),/s2=s1=,S,(3),/,S(2)=,2*(S(3)+,1),/s2=s1=,S,(2),/,S(1)=,2*(S(2)+1),/s2=s1=,S(1),i,=4,s1=2*(s2,+1);,s2=s1;,s1=2*(s2,+1);,s2=s1;,s1=2*(s2,+1);,s2=s1;,s1=2*(s2,+1);,s2=s1;,i,=3,i,=2,i,=1,7/15/2025,第,九讲,函数,、,递推,、,递归,递推举例(,
7、2,),大,9,递,推数列,一个数列从某一项起,它的任何一项都可以用它前面的若干项 来确定,这样的数列称,为,递推数,列,,表示某项与其前面的若干 项的关系就称,为,递推公,式,。例如自然数,1,2,,,n,的阶乘就可 以形成如下数列:,1,!,,2,!,,,3,!,,,(,n,-1)!,n!,另,fact(n),为,n,阶乘,依据后项与前项的关系可以写出递推公,式:,fact(n,),=,n,*,fact(,n,-1,),(,通项公,式,),fact(1,),=,1,(边界条件),7/15/2025,第,九讲,函数,、,递推,、,递归,递推算例(,3,),大,10,递推算法程序实现:,有了通
8、项公式和边界条件后,采用循环结构,从边界条件出 发,利用通项公式通过若干步递推过程就可以求出结果;,例:,王小二自称刀工不错,有人放一张大的煎饼在砧板上,问他:,“饼不许离开砧板,切,100,刀最多能分成多少块?”,7/15/2025,第,九讲,函数,、,递推,、,递归,分,析:,切一刀,大,11,切二刀,切三,刀,切四刀,令,q(n),表,示切,n,刀,能,分,成,的块数,,,由上图,可,知,q(1),=1+1=,2,q(2)=1+,1+2=,4,q(3)=1+,1+2+,3=,7,q(4)=,1+1+,2+3+4=,1,1,7/15/2025,第,九讲,函数,、,递推,、,递归,分,析:,
9、切一刀,大,12,切二刀,切三,刀,切四刀,在,切法上,是,让每两,条,线都有,交,点。用,归,纳法可,得,出,q,(,n),=,q,(n-,1),+,n,q,(,0),=,1,(,边界条,件,),7/15/2025,第,九讲,函数,、,递推,、,递归,递推算例(3,),参,考程序:,大,13,7/15/2025,第,九讲,函数,、,递推,、,递归,递归,递归算,法,在可计算理论中占有重要地位,它是算法设计的有,力工具,对于拓展编程思路非常有用。,就,递归算,法,而言不涉及高深数学知识,只不过初学者建立起递 归概念不太容易。,看一个简单的例子:,大,14,7/15/2025,第,九讲,函数,、
10、递推,、,递归,递归,有5 个人坐在一起,问第 5 个人多少岁?他说比第 4个人,大两岁。问,第4,个人岁数,他说比,第 3,个人大两岁。问,第 3,个人,又说比第 2个人大两岁。问第 2个人,说比第,1个人,大两岁。最后问第 1个人,他说是 10岁。请问第 5 个人多,大?,解题思路:假设用 age(i)表示第 i个人的岁数,则,大,15,借助循环结构采用递推方法求解!,age(5),=,age(4),+,2;,age(4),age(3),=,=,age(3),age(2),+,+,2;,2;,age(2),=,age(1),+,2;,age(1),=,10;,7/15/2025,第,九讲
11、函数,、,递推,、,递归,一般形式:,age(n)=10,age(n)=age(,n,-1)+2,(n=1),(n 2),大,16,7/15/2025,第,九讲,函数,、,递推,、,递归,分,析:,上述求解是从求解目标出发,即将第,n 个人的年龄表示第(n-1),个人的年龄,再回溯到第,(n-2)个人的年龄,直 到第 1,个人的年龄;,(,回溯,阶段),然后,采用递推方法,从第,1,个人的已知年龄推算第,2,个,人的年龄,在推算第,3个人的年龄,直到推算出第,5个人的 年龄;,(,递推,阶段),这是一个递归问题,对它的求解可以分成,回溯,和,递推,两 个阶段;显而易见,,,如果不希望递归过程
12、无限制的进行下,去,,,必须,有一,个,结束递归过,程,的条,件,;如,:,age(1)=10,大,17,7/15/2025,第,九讲,函数,、,递推,、,递归,计,算年龄,函,数:,int,age,(,int,n),大,18,int,c;,if(n=,1)c,=,1,0,;,el,s,e c,=,a,g,e,(,n,-,1),+2;r,e,tu,r,n,c;,7/15/2025,第,九讲,函数,、,递推,、,递归,递归调用,大,19,在,调用一,个,函数的,过,程中又,出,现直接,或,间接地,调,用该,函,数本身,,,称为函,数,的,递归,(,r,e,c,ur,s,i,v,e),调,用,;,
13、C+,+,允,许,函,数的递,归,调,用,;,例:,int,f,(int,x),int,y,z,;z,=,f,(,y),;,ret,u,rn,2,*,z;,7/15/2025,第,九讲,函数,、,递推,、,递归,递归调用,直接调用,大,20,间接调用,注意,:上述两种情况都是,无终,止,的,自身,调,用;,显,然,,程序中不应该出现这种无终止的调,用,,而,只,应出现,有限次的,有终止的递归调用,;,可,以,用,i,f,语,句,控制,,,实现递归调用结,束,;,7/15/2025,第,九讲,函数,、,递推,、,递归,递归函数,包,含,递归,调,用,的函,数,,称,为,递,归函,数,;,计,算年
14、龄,函,数,:,int,age,(,int,n),int,c;,if(n=,1)c,=,1,0,;,el,s,e,c,=,a,g,e,(,n,-,1),+2;,return,c;,大,21,7/15/2025,第,九讲,函数,、,递推,、,递归,递归函数,大,22,计,算年龄,递,归函数,执,行过程:,ag,e(,5,),=,a,ge,(,4),+,2,/,/,c,=,ag,e(,4,),+2,=,a,ge,(,3),+,2,+,2,/,/,c,=,ag,e(,3,),+2,=,ag,e,(2),+,2,+,2,+,2,/,c,=,a,ge(2),+,2,=,a,ge,(,1),+,2,+,2
15、2,+,2,;,/,/,c,=,10,;,7/15/2025,第,九讲,函数,、,递推,、,递归,计算年龄程序,大,23,7/15/2025,第,九讲,函数,、,递推,、,递归,递归算例(,2,),大,24,用,递归方,法,计算,n!,算,法思路:,若,n=,10,则,n,!,=,10,*,9!,定义函数,fa,c,t,(,n),表,示,计,算,n,!,的,函数,,则,有,fa,c,t(n),=,n,*,f,a,ct,(,n,-,1),n,1,f,ac,t,(n),=,1,n,=,0,n,=,1;,7/15/2025,第,九讲,函数,、,递推,、,递归,递归算例(,2,),大,25,阶,
16、乘计算,递,归函数:,i,i,n,n,t,t,f,f,a,a,c,c,t,t,(,(,i,i,n,n,t,t,n,n,),),int,c;,if,(,c,n,=,=,n,=,*,0,f,|,|,a,n,c,t,=,(,n,=,-,1,1,),),;,c,=,1;,r,e,e,l,s,t,u,e,r,n,c;,c,=,n,*,fact(,n-,1,),;,retu,r,n c;,结束递归条件,7/15/2025,第,九讲,函数,、,递推,、,递归,递归算例(,3,),大,26,用,递归函,数,计算组,合,数:,C,(m,n,),,即从,m,个,数,中取,n,个,数,的组合,数,;,C,(m,n,
17、),=,C,(,m,-,1,n,),+,C(,m,-1,n,-,1);,C,(,m,n),=,0,m,0,n,10,),retu,rn,-1;,i,f,(n,=,10),c,=,1,;,else,c,=,2,*,(,co,u,nt(n,+1),+,1,),;ret,u,rn,c;,大,33,7/15/2025,第,九讲,函数,、,递推,、,递归,递归方法,大,34,递,归实现:,在,时,间,和空间,上,的开销,比,较大;,但,符合人,们,的思路,,程,序,容,易理解;,递,归函数:,只,须,写,出,递归,公,式,和,递,归,结束条,件,(即边,界,条,件,),即,可,很容易,写,出递归,函,数
18、7/15/2025,第,九讲,函数,、,递推,、,递归,局部变量和,全局,变,量,大,35,一,个,程,序,可,以包括,若,干,个,源,程,序文,件,(,文件模,块,);,每,个源程,序,文件又,包,括若干,个,函数,;,在,每个函,数,中和函,数,外都可,以,定,义,变,量,。,这,些在不,同,地方定,义,的变量,是,否都在,程,序的全,部,范围,内,有效?,如,果不是,,,他们,的,有,效范,围,是,什么呢?,7/15/2025,第,九讲,函数,、,递推,、,递归,局部变量和,全局,变,量,大,36,局,部变,量,在一,个,函数内,部,定义的,变,量是内,部,变量,,它,只在,本,函数
19、范,围,内有效,,,换句话,说,只有在,本,函数内,才,能使,用,它们,,在,此函数,之,外是不,能,使用这,些,变量的,。,同样,的,,在复,合,语句中,定,义的变,量,只在复,合,语句内,范,围内,有,效。,7/15/2025,第,九讲,函数,、,递推,、,递归,fl,o,at,f1,(,int,a),/,函数,f1,int,b,c,;,char,f,2(int,in,t i,j,;,int m,a,in(),in,t m,n,;,int,p,q,;,b,、,c,有效,a,有效,x,in,t y),i,、,j,有效,/,/,函数,f2,x,、,y,有效,/,/,主函数,p,、,q,在复,合
20、语句中,有,效,m,、,n,有效,大,37,7/15/2025,第,九讲,函数,、,递推,、,递归,a,也,只,在,f,1,函,数,中,有,效。其,他,函数不,能,调用。,大连理,工大学,盘锦校,区基础教学部,38,说,明:,(1,),主函,数,m,ai,n,中,定,义的变,量,(,m,n,),也,只在主,函,数,中,有,效,不,会因为,在,主函数,中,定义而,在,整个文,件,或,程,序中有,效,。主函,数,也不能,使,用其他,函,数中定,义,的,变,量。,(2,),不同,函,数中可,以,使用同,名,的变,量,它,们,代,表,不,同,的对象,互,不,干,扰,。例,如,在f,1,函,数,中定义
21、了,变量,b,和c,倘,若,在,f,2,函,数,中也定,义,变,量b,和,c,它们,在,内存,中,占不同,的,单,元,不,会混淆。,(3,),可以,在,一个函,数,内的复,合,语句中,定,义变,量,这,些,变量只,在,本复合,语,句中有效,这,种,复,合语句,也,称,为,分程序,或,程序块。,(4,),形式,参,数也是,局,部变量,。,例如,f,1,函,数中的,形,参,大连理,工大学,盘锦校,区基础教学部,7/15/2025,第,九讲,函数,、,递推,、,递归,大,39,(5,),在函,数,声明中,出,现的参,数,名,其,作,用范围,只,在,本,行,的括号,内,。实际,上,,编译,系,统对函
22、数,声明中,的,变量,名,是忽略的,即使在调用函数时也没,有,为它们分配存,储,单元。,例如,in,t,max(in,t,a,in,t,b);,int max,(,int x,inty),coutxy,endl,;,coutabendl;,/,/,函数声明中出,现,a、,b,/函数定义,形参,是,x、y,/,/,合法,,,x、y在函数体中有效,/,非法,,,a,、,b,在函数体中无效,编,译时认,为,ma,x,函,数,体中,的,a,和,b,未经,定,义。,7/15/2025,第,九讲,函数,、,递推,、,递归,全局变量,大,40,程序的,编,译单位,是,源程序,文,件,(,.,c,p,p,)
23、一,个,源文,件,可以包,含,一个或,若,干,个,函,数,。,在函数,内,定义的,变,量,是,局,部,变,量,而,在函数,之,外定,义,的变量是外部变量,称,为,全,局变,量,(g,l,obal v,a,ria,b,l,e,也,称,全,程,变,量,),。,全局变,量,的有效,范,围为从,定,义变量,的,位置开,始,到,本,源文件,结,束。,如,7/15/2025,第,九讲,函数,、,递推,、,递归,int,p=,1,q,=5,;,/全局,变,量,float,f/,/,定义函,数,f1,1(a),int,a;,围,全局,变,量,c1,、,c2,的作用,范,围,(int a),大,41,int,
24、b,c,;,char,c,1,c2;,ch,a,r,f,2,(,int,x,int,y,),/,定义函数,f2,int,i,j,;,main,(,)/,/,主函数,int,m,n,;,7/15/2025,第,九讲,函数,、,递推,、,递归,大,42,p,、,q、c1、,c,2,都是全局变量,但它们,的,作用范围不,同,,,在m,a,i,n,函数和,f2,函数中,可,以使用,全,局变,量,p,、,q、,c1,、,c,2,,,但,在函,数,f1,中只能,使,用全局,变,量,p,、,q,,,而,不,能使,用,c1,和,c,2,。,在,一个函,数,中既可,以,使用本,函,数中的,局,部变量,,,又,可
25、以使用,有,效的全,局,变量。,说,明:,(1,),设全,局,变量的,作,用是增,加,函数间,数,据联系,的,渠,道。,(2,),建议,不,在必要,时,不要使,用,全局变,量,,因为:,全,局,变,量在程,序,的,全部,执,行过程,中,都占用,存,储单,元,,而不是仅在需要时才开辟单元。,7/15/2025,第,九讲,函数,、,递推,、,递归,大,43,在,程,序,设计中,,,在划分,模,块时要,求,模块的,内,聚,性,强、与,其,他模块,的,耦合性,弱,。,即,模,块,的功能,要,单,一,(不要,把,许多互,不,相干的,功,能放到,一,个模块,中,),,与,其他模,块,的相互,影,响要尽,
26、量,少,而,用,全局变,量,是,不,符合这,个,原则的。,一般,要,求把程,序,中,的,函,数,做成一,个,封闭体,,,除,了可以通,过,“实,参,形,参,”,的,渠道,与,外界,发,生联,系,外,没,有,其他渠,道,。这样,的,程序移,植,性好,,可,读,性,强。,7/15/2025,第,九讲,函数,、,递推,、,递归,大连理,工大学,盘锦校,区基础教学部,44,使,用全局变量,过,多,会降低程序的清晰性。在各,个,函数执,行,时都可,能,改变全,局,变量的,值,,程序,容,易,出,错。因,此,,要限,制,使用全,局,变量。,(3,),如果,在,同一个,源,文件中,,,全局变,量,与局部,变
27、量,同,名,则,在,局部变,量,的作用,范,围内,,全,局变量,被,屏,蔽,,即它,不,起作用,。,变,量的有,效,范围称,为,变量的,作,用,域,(,sco,p,e),。,归,纳起,来,,变量,有4种,不同的作用,域:,文件作用,域,(,file s,c,ope,),、,函,数作用,域,(,function,scope,),、,块作,用,域,(b,l,ock,s,c,o,pe,),和,函,数原型作用,域,(,functi,o,n,p,r,oto,t,y,p,e,sco,p,e,),。,文件作,用,域是全,局,的,其,他,三,者,是局部,的,。,44,大连理,工大学,盘锦校,区基础教学部,7
28、/15/2025,第,九讲,函数,、,递推,、,递归,变量的存储,类别,大,45,已介绍了变,量的,一,种属,性,作,用,域,,,作用,域,是从,空,间的角,度,来分析,的,,分,为,全,局变,量,和,局部变,量,。,变量还有另,一种属,性,存储,期,(,storage d,u,rat,i,o,n,,,也称,生,命,期,),。,存,储期是,指,变量在,内,存中,的,存在时,间,。这是从变量值存在,的,时,间,角,度,来分析 的,。存储,期,可以分,为,静态存,储,期,(,static,storage d,u,rat,i,o,n,),和,动,态,存,储,期,(,dyn,a,mic,sto,r,a
29、ge d,u,ration),。,这,是由变量,的,静,态存,储,方,式,和,动,态,存,储,方,式决定,的,。,7/15/2025,第,九讲,函数,、,递推,、,递归,存储方式,大,46,静,态存,储,方,式是指,在,程序运,行,期间,,系,统对变,量,分,配,固定的存储空间。,动,态存,储,方,式则是,在,程序运,行,期间,,系,统对变,量,动,态,地分配,存,储空间。,7/15/2025,第,九讲,函数,、,递推,、,递归,存储方式,先,看一下,内,存中的,供,用户使,用,的存储,空,间的情,况,。这,个,存储空间可以分为三部分,即:,(1,),程序区,(2,),静态,存,储区,(3,)
30、动态,存,储区,大,47,7/15/2025,第,九讲,函数,、,递推,、,递归,静态存储区,大,48,数,据分别,存,放,在,静,态,存储区,和,动态,存,储,区中。,全,局变,量,全,部存放,在,静态存,储,区,中,,在,程序开,始,执行,时,给全局,变,量分配,存,储单元,,,程序执,行,完毕就,释,放这,些,空间。,在,程序执,行,过程中,它,们占据,固,定的存,储,单元,,而,不是,动,态地进,行,分配和,释,放。,7/15/2025,第,九讲,函数,、,递推,、,递归,动态存储区,大,49,在,动态存,储,区中存,放,以下数,据,:,函数形式参数,。在调用函,数,时给形参分配存储
31、空间。,函数中,的,自动变,量,(未加,s,t,atic,声,明,的局部,变,量,,详,见后面,的,介绍,),。,函数调,用,时的现,场,保护和,返,回地,址,等。,对,以上这,些,数据,,在,函数调,用,开,始,时,分,配动态,存,储空,间,,函数结束时释放这些空间。在程,序,执行过程中,,这,种分配,和,释放是,动,态的,,如,果在一,个,程序,中,两,次,调,用,同一函数,则要进,行,两次,分,配和释,放,,而两次分配,给,此函数,中,局部变,量,的存储,空,间地址,可,能,是,不,相同,的。,7/15/2025,第,九讲,函数,、,递推,、,递归,50,大连理,工大学,盘锦校,区基础教
32、学部,如,果在一个程,序,中包含若干个函数,每个函数中的,局,部变量,的,存储期,并,不等于,整,个程序,的,执行周,期,,它,只,是整个,程,序执行,周,期的一,部,分。根,据,函数调,用,的情,况,,系统对局部变量动态地分配和释,放,存储空间。,在,C+,+,中,变,量,除,了,有,数,据,类,型,的,属,性之外,,,还,有,存,储,类,别,(,storage,c,l,a,ss),的属性。存,储,类别指的是数,据,在内存,中,存储的,方,法。存,储,方法分,为,静态存,储,和,动,态,存,储,两,大,类。具,体,包,含,4,种,:,自动,的,(,auto,),、,静态的,(s,t,atic
33、)、,寄存,器,的,(regi,s,t,e,r),和,外,部的,(ex,t,e,r,n),。,根,据变量,的,存储类,别,,可以,知,道变量,的,作用域,和,存储,期。,50,大连理,工大学,盘锦校,区基础教学部,7/15/2025,第,九讲,函数,、,递推,、,递归,自动变量,大,51,函,数,中,的局部,变,量,如,果,不用关,键,字sta,t,i,c,加,以,声,明,,编译,系,统对它,们,是动态,地,分配存,储,空间,的,。,函,数,的,形参,和,在,函数中,定,义的变,量,(,包,括,在,复合语,句,中定义,的,变,量,),都,属此类。,在,调,用,该函数,时,,系统,给,形参和,
34、函,数中定,义,的变量,分,配存储,空,间,数,据,存储在,动,态存储,区,中。在,函,数调,用,结束时,就,自动释,放,这些空,间,。如果,是,在复合,语,句中,定,义的变,量,,则在,变,量定义,时,分配存,储,空间,,在,复合,语,句结束,时,自动释,放,空间。,因,此这,类,局,部变,量,称,为自,动,变,量,(,au,t,o,v,a,ria,bl,e,),。,7/15/2025,第,九讲,函数,、,递推,、,递归,用,r,egis,te,r,声明,寄,存器,变,量,一,般,情,况下,,变,量的值,是,存放在,内,存中的,。,当程序,中,用到哪,一,个变量,的,值时,,由,控制器,发,
35、出指令,将,内存中,该,变量的,值,送,到CP,U,中,的,运,算,器。经,过,运算器,进,行运算,,如,果需要,存,数,再,从,运算器,将,数据送,到,内存存,放,。,如,图,所,示,。,为,提,高,执行效,率,,,C+,+允,许将,局,部,变,量,的,放,在,CP,U,中,的,寄存,器,中,需,要,用时直,接,从,寄,存,器取出,参,加运算,,,不必再,到,内存中,去,存,取,。这种,变,量叫做,寄,存器变,量,,,用,关,键,字,regi,s,t,e,r,作,声明。,但,是,是,建,议性的,;,值,大,52,7/15/2025,第,九讲,函数,、,递推,、,递归,用,s,t,a,ti,c
36、声,明静,态,局部,变,量,大,53,有,时希望,函,数中的,局,部变量,的,值在函,数,调用结,束,后不,消,失而保留原值,即其占用的存储单,元,不释放,在下,一,次该函,数,调用时,,,该变量,保,留上一,次,函数调,用,结束,时,的值。,这,时就应,该,指定该,局,部变量,为,静态局,部,变,量,(,st,a,t,i,c,l,oca,l,v,a,r,iab,l,e,),。,7/15/2025,第,九讲,函数,、,递推,、,递归,大,54,7/15/2025,第,九讲,函数,、,递推,、,递归,先,后,3,次,调,用,f,函,数,时,,,b,和,c的,值,如,书,中表,所,示。,大,55
37、7/15/2025,第,九讲,函数,、,递推,、,递归,静态局部变,量说明,(1,),静态,局,部变,量,在,静态存,储,区,内,分,配,存储单,元,。,在,程序整,个,运行期,间,都不释,放,。,而,自,动,变,量,(,即,动,态,局部变,量,)属,于,动,态存储,类别,,存,储,在动态,存,储,区,空,间,(,而,不是静,态,存储区,空,间,),,,函,数调用,结,束后,即,释放。,(2,),为,静,态,局部变,量,赋初值,是,在,编译,时,进行值,的,,,即,只赋初,值,一次,,在,程序运,行,时它已,有,初值。,以,后,每,次调用,函,数时不,再,重新赋,初,值而只,是,保留上,次,
38、函,数,调用结,束,时的值,。,而,为,自,动,变量赋,初值,,,不,是,在,编,译时进,行,的,而,是,在函数,调,用时进,行,,每调,用,一,次,函数重,新,给一次,初,值,大,连,,,理,工,相,大,学,当,盘锦,校,于,区,基,执,础,教,行,学,部,一,次赋值,语,句。,56,56,大连理,工大学,盘锦校,区基础教学部,7/15/2025,第,九讲,函数,、,递推,、,递归,(3,),如果,在,定义局,部,变量时,不,赋初值,的,话,,对,静态,局,部变,量,来,说,编,译,时自动,赋,初,值,0(对,数值型,变量,),或,空字,符,(,对,字,符,型,变,量,)。,而对,自,动,变
39、量,来,说,,如,果,不赋初值,则它的值是一,个,不确定,的,值,。这是由,于,每次函,数,调用结,束,后存储,单,元已释,放,,下次,调,用,时,又重新,另,分配存,储,单元,,而,所分配,的,单元中,的,值,是,不确定,的,。,大,57,(4,),虽,然,静,态局部,变,量,在函,数,调用结,束,后仍然,存,在,,但,其他函数是不能引用它的,也就是,说,,在其他函,数,中它,是,“,不可见,”,的。,7/15/2025,第,九讲,函数,、,递推,、,递归,静态局部变,量使用,大,58,在,什么情,况,下需要,用,局部静,态,变量,呢,?,1,.,需,要,保,留函数,上,一次调,用,结束时
40、的,值,。例如可以,用,下例中,的,方法求,!,。,如:,int,fa,c(,int,n),sta,t,ic,in,t,f=1;,/,/,f,为,静,态局部,变,量,函,数,结束,/,时,f,的,值,不,释,放,/,/,在,f原,值基础,上,乘,以,n,f=f,*,n;ret,u,rn,f,;,7/15/2025,第,九讲,函数,、,递推,、,递归,静态局部变,量使用,大,59,2,.,如,果,初,始化后,,,变量只,被,引用而,不,改变其,值,,则这,时,用静态局部变量比较方便,以免每,次,调用时重新赋值。,7/15/2025,第,九讲,函数,、,递推,、,递归,用,e,x,t,e,rn,
41、声,明外,部,变量,大,60,全,局,变,量,(,外,部,变,量,)是,在函数,的,外部定,义,的,,它,的,作用域,为,从变量,的,定义处,开,始,到,本,程序文,件,的,末,尾,。,在此,作,用域内,,,全局变,量,可以为,本,文件中,各,个函,数,所引用,。,编译,时,将,全局变,量,分配在,静,态存储,区,。,有,时,需,要用,ext,e,r,n,来,声,明,全,局变量,,,以扩展,全,局,变,量,的作用,域,。,7/15/2025,第,九讲,函数,、,递推,、,递归,在一个文件,内声,明,全局,变,量,提,前引用,声,明,大连理,工大学,盘锦校,区基础教学部,61,大连理,工大学,盘
42、锦校,区基础教学部,7/15/2025,第,九讲,函数,、,递推,、,递归,在多文件程,序中,声,明外,部,变量,大,62,外,部变量,声,明,分,析下例:,file1.cpp,extern inta,b;,in,t,main,(,),couta,bendl;return0;,注意:,file2.cpp,inta=3,b=4;,extern,是用作,变量声明,,而不是,变量定,义,。它只是对一 个已定义的外部变,量,作声明,以扩展其作用,域,。,7/15/2025,第,九讲,函数,、,递推,、,递归,用,extern,扩,展,全,局变量,的,作用域,,,虽然能,为,程序设,计,带来方,便,,但
43、应,十,分慎重,,,因为在,执,行一个,文,件中的,大,63,函,数时,,,可,能会改,变,了该全,局,变量的,值,,从而,会,影响到,另,一文件,中,的函数,执,行结果。,7/15/2025,第,九讲,函数,、,递推,、,递归,用,s,t,a,ti,c,声,明静,态,外部,变,量,大,64,有,时在程,序,设计中,希,望某些,外,部变,量,只,限于被,本,文,件,引用,,而,不能被,其,他文件,引,用,。这时可以在定义,外,部变量,时,加一,个,stat,i,c,声,明,。例如:,file1.cpp,stati,c,in,t,a=3;in,t,mai,n,(,),file2.cpp,exte
44、r,n,in,t,a;,in,t,fu,n,(in,t,n),a=a*n;,7/15/2025,第,九讲,函数,、,递推,、,递归,这,种,加,上,s,t,a,t,i,c,声明、,只,能用于,本,文件的,外,部变量,(,全局变,量,)称,为,静,态外部,变量,。这,就,为程序,的,模块化、,通,用性提,供,了方便,。,如果已,知,道其他,文,件不需,要,引用本,文,件的全,局,变量,,可,以对本,文,件中的,全,局变量,都,加上,s,t,atic,,,成,为静态,外,部变量,,,以免被,其,他文件,误,用。,大,65,需,要,指,出,不,要,误认为,用,sta,t,i,c,声,明的外,部,变量
45、才采,用,静态存,储,方式(,存,放在静,态,存储区,中,),而,不,加,s,t,atic,的,是,动态存,储,(存放,在,动态存,储,区)。,实,际上,,两,种形式,的,外部变,量,都用静,态,存储方,式,,只是,作,用范围,不,同而已,,,都是在,编,译时分,配,内存的。,7/15/2025,第,九讲,函数,、,递推,、,递归,存储期和作,用域,大,66,7/15/2025,第,九讲,函数,、,递推,、,递归,变量的声明,和定义,大,67,关,于声明,和,定义:,针,对函数,而,言,,,函,数,的声明,是,函数的,原,型,而,函,数的,定,义是函,数,功能的,建,立;,在,声明部,分,出现
46、的,变,量有两,种,情况:,一,种是需,要,建立,存,储空间,的,(如,i,n,t,a,),;,另一种,是,不需要,建,立存储,空,间,的,(,e,xter,n,i,n,t,a,),;,前,者称为,定,义性声,明,,或简,称,定义;,后,者称为,引,用性声,明,;,7/15/2025,第,九讲,函数,、,递推,、,递归,为,叙述方,便,,把建,立,存储空,间,的声明,称,为定义;,大,68,如,:,in,t,a;,而,把不需,要,建立存,储,空间的,声,明称为,声,明;,如:,ext,ern,int,a;,7/15/2025,第,九讲,函数,、,递推,、,递归,外部,变,量定,义,和,外部变,
47、量,声,明,的,含,义是不,同,的。外,大,69,部,变量的定义只能有一次,它的位置,在,所有函数之外,,而,同一文,件,中,的,外,部,变量的,声,明,可以,有,多次,,它,的位置,可,以在函,数,之内,,也,可以在,函,数之外,。,系统根,据,外部变,量,的,定义,分,配存储,单,元。对,外,部变量,的,初始化,只,能在,定,义,时进,行,,,而不能,在,声明中,进,行。所,谓,声明,,其,作用是,向,编译系统发出一个信息,声明该变,量,是一个在后面定,义,的外部,变,量,仅,仅,是为了,提,前引用,该,变量而,作,的声明。,exte,r,n,只,用,作声明,,,而不用,于,定义,。,7/
48、15/2025,第,九讲,函数,、,递推,、,递归,用,s,t,a,t,ic,来声明一个变量的作用有,二,:,大,70,(1),对局部变量用,static,声明,使该变量在本函数调用结,束后不释放,整个程序执行期间始,终,存在,,,使其,存,储 期为程序的全过程。,(2),全局变量用,stati,c,声明,则该变量的作用域只限于本,文件模块,(,即被声明的文件中,),。,7/15/2025,第,九讲,函数,、,递推,、,递归,内部函数和,外部,函,数,大,71,函,数本质,上,是全局,的,因,为,一,个函数,要,被另外,的,函,数,调,用,但,是,也可以指定,函,数只能被本文件调用,,而,不能
49、被,其,他文件,调,用。,根,据函数能否被其他源文件调,用,将函数区分,为,内,部,函,数,和,外,部函,数,。,7/15/2025,第,九讲,函数,、,递推,、,递归,内部函数,大,72,如,果一个,函,数只能,被,本文件,中,其他函,数,所调,用,它,称,为,内,部函,数,。,在定义内部函数,时,在,函数名和函,数,类型的,前,面,加s,t,a,t,i,c,。函,数,首部的,一,般格式为,stat,ic,类,型标识,符,函,数,名,(形,参,表,),如,static intfun(inta,int b),内,部函数,又,称静,态,(,s,t,atic,),函,数。使,用,内部函,数,可以,
50、使,函数只,局,限于所,在,文件,。,如,果在不,同,的文件,中,有,同,名,的内部,函,数,互,不,干扰,。,通,常把只,能,由同一,文,件使,用,的函数和外部变量放在一个文件,中,在它们,前,面都冠,以,sta,t,i,c使,之局部,化,其,他,文,件不能,引,用。,7/15/2025,第,九讲,函数,、,递推,、,递归,外部函数,大,73,(1,),在定,义,函数,时,如,果,在,函,数首部,的,最左端,冠,以关,键,字,e,x,t,e,r,n,则,表,示,此函数,是,外部函,数,,可供,其,他文,件,调用。,如,函数首,部,可以写为,extern int fun(int a,int b






