版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章函数
(TheUser-definedFunction)Functiondeclaration,called,returnavalueandpassingcharacter(定义、调用、返回值方法及参数传递方式)Functionusage(掌握函数使用惯用方法)Variablescopeandstorageclass(变量作用域和变量存放类别)第1页8.1概述一、C函数概念将一个C程序分为若干模块,每个模块实现一个特定功效,在C语言中用函数来实现模块功效。
函数:含有某种功效独立程序段。IndependentProgramBlock
⑴从程序设计方法看C函数:它是实现模块化程序设计语法元素。(Syntaxelement)⑵从C语言中程序组成方式看C函数:它是程序基本组成单位。(Programfoundation)第2页二、C函数与C程序结构⑴C程序由主函数(main函数)和若干个子函数组成;⑵主函数调用子函数;⑶子函数在定义时是并列;⑷子函数可相互调用,也可被屡次调用。mainabcdefghhieg第3页#include<stdio.h>#include<math.h>voidmain(){charprime(int);//函数申明或定义函数原形(FunctionPrototype)intn;printf("\nInputaninteger:");scanf("%d",&n);if(prime(n)==‘g’)//函数调用printf("\n%disaprime.",n);elseprintf("\n%disNOTa prime.",n);}//函数定义(Function
Definition)charprime(intn)//函数类型、名称,形式参数定义{charflag='g';inti,k;k=sqrt(n)+1;for(i=2;i<=k;i++) if(fmod(n,i)==0) {flag='r'; break;}returnflag;//返回值}//函数体定义第4页main()/*主函数*/{print_star();/*调用print_star函数打印****/
print_message();/*调用print_message函数写字*/
print_star();/*调用print_star函数打印****/}print_star()/*定义print_star函数*/{prinf(“\n**********”);}print_message()/*定义print_message函数*/
{prinf(“\nHello!”);}函数调用例:运行结果:**********Hello!**********
第5页三、C函数特点⑴一个源文件由一个或多个函数组成,它是一个独立编译单元。(Independentcompilingunit)⑵一个C程序由一个或多个源文件组成。(built-upofmanyfiles)文件3:函数Complex.h#include"Vector.h"classCComplex{…}文件2:函数Jpcal3.h#include"Complex.h"classCEq{…}文件1:主函数#include"jpcal3.h"#include"PBcal.h"Main(){…}文件4:函数Vector.h#include<stdio.h>#include<math.h>classCVector{…}第6页⑶Programstartfromthe“main”function,andfinallyendedattheendofthe“main”function.(C程序执行总是从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序运行。)⑷Functioncannotbedeclaredbynesting,butcanbecalledbynesting.“main”functioncanneverbecalled.(函数不能嵌套定义,但能够相互调用。注意不能调用main函数。)第7页四、函数分类(CategoryofFunctions)1.从函数参数形式看,函数可分为四类:①Noarguments
andno
returnvalue
voidprint_star(void){printf(“**********”);}orvoidprint_star(){printf(“**********”);}第8页Argumentsbutnoreturnvalue
voidmax(inta,intb){intz;z=a>b?a:b;printf(“Themaxis:%d”,z);}Noargumentsbutreturnavalue
intget_number(){intnumber;scanf(“%d”,&number);returnnumber;}第9页有参函数(ArgumentsWithreturnvalue)有参函数例:(输出两数中大者)#include<stdio.h>
intmax(intx,inty);//函数原形main(){intnum1,num2,a;scnaf("%d,%d",&num1,&num2);a=max(num1,num2);printf("max=%d",a);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}第10页2.Byuserusage(从用户使用角度看,函数有两种)①StandardLibraryFunction标准函数库函数:是由编译系统提供已设计好函数,用户只需调用而无需去实现它。前几章用过scanf,printf,getchar,putchar,fmod,sqrt等都是库函数。②User-definedFunction用户自定义函数:由程序员自己定义和设计函数。需要程序员自己来编写函数功效实当代码。第11页8.2DefinitionofFunction(函数定义普通形式)
一、Noargumentsfunction
definition(无参函数定义)Typefunction_name(){variableDeclaration(说明部分)sentences(语句)}比如:Voidprint_message(){printf(“\nHello!”);}NoParameterspassedFunctionhead
FunctionBody
or:Voidprint_message(void){……}Noinputandnoreturnvalue第12页二、
Argumentsfunctiondefinition(有参函数定义形式)Typefunction_name(parameterlist)类型标识符函数名(形式参数表列){variableDeclaration(说明部分)sentences(语句)}有参数传递formalparameterslist第13页比如:intmax(intx,inty)/*求x和y二者中大者,x,y为形参*/{intz;/*函数体中变量说明*/z=x>y?x:y;return(z);/*将z值作为函数返回值*/}三、
TheEmptyFunction(空函数定义)类型标识符函数名(){}比如:dummy(){}功效:donothing(调用后什么也不做)用处:建立程序结构,在需要时补充功效。typefunction_name(){}第14页四、
对形参说明传统方式上面讲形式参数表说明形式是新版C语言表示形式(当代方式),即形式参数说明是类型和参数在一起说明。传统形式参数说明是类型和参数分别说明。如:按传统方式说明形参intmax(x,y)intx,y;{……}按当代方式说明形参intmax(intx,inty){……}这两种方式都能够使用,但推荐使用当代方式。
注意这里是逗号第15页8.3Argumentsandreturnvalue
函数参数和函数值
一、
形式参数和实际参数formalarguments
:在定义函数时函数名后面小括弧中变量名,简称形参。actual
arguments
:在调用函数时函数名后面小括弧中表示式,简称实参。main(){inta,b,c;scanf(“%d,%d,&a,&b);c=max(a,b);printf(“Maxis%d”,c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}formal
argumentactualargument第16页上例中形参加实参、函数名与返回值之间关系:c=max(a,b);-----------------------
max(intx,inty)
{………
returu(z);}
Actualarguments:whenprogramexecutionpassthevaluetofunctionformalarguments:informthecompliertoallocatememoryspaceAssignthereturnvaluetothefunctionname第17页formalargumentsarelocalones(形参是函数内部变量,只在函数内部才有意义;形参调用前不占内存单元,调用时占用,调用后释放)对每个形参必须指明其名字和数据类型; max(inta,b)Theactualargumentmusthasadefinitudevalue (实参能够是常量、变量或表示式,而且必须有确定值)Formalargumentsmustmatchactualonesinnumbersandtype(实参个数、类型必须与对应形参一致)Someinstruction(关于参数几点说明):第18页c=max(a,b);-----------------------
max(intx,inty)
{………
returu(z);}实参对形参数据传递是值传递,即单向传递,只由实参传递给形参,反之不可。调用结束后,只有形参单元被释放,实参单元中值不变。ValuesofargumentsNoreturnvalues第19页二、函数返回值(Returnvalue)定义:经过函数调用使主调函数得到一个确定值,称为函数返回值。比如:c=max(3,5);此时函数返回值是5,所以c=52.函数返回值语句return
函数返回值是经过return语句取得。return语句将被调用函数一个确定值带回主调函数中去。return语句普通形式:
return(value);
returnvalue;“函数返回值”是有确定值常量、变量或表示式。第20页说明:⑵一个函数中能够有多个return语句,不过一次函数执行只能执行其中一个。当执行到某个return语句时,则终止函数执行,并带回函数值。⑶若函数体内没有return语句,就一直将函数执行完,再返回调用函数,有一个不确定值带回。⑴return后面值能够是一个表示式,比如:z=x>y?x:y;return(z);return(x>y?x:y);
⑷return后面能够无“返回值”(即return;),则该return语句只起到终止函数执行,返回主调函数作用。第21页三、函数值类型(Typeofreturnvalue)
函数定义时说明函数类型(即函数值类型),应该与return语句类型一致。说明:⑴凡不加类型说明函数,一律自动按整型处理。⑵假如函数类型和return语句类型不一致,以函数类型为准。对数值型数据,能够自动进行类型转换。即函数类型决定返回值类型。⑶假如函数不返回值,能够将函数定义为“无类型”void(或称“空类型”)。比如:voidprint_star(){……}第22页8.4函数调用(Functioncalls)一、函数调用普通形式(Methods)
variable_name(Arguments
list)
Argumentsfunction:Noarguments
:
variable_name
()
说明:(2)实参加形参个数相等,类型一致,按次序对应,一一传递数据;⑴实际参数表中多个实参间用逗号隔开,实参能够是常量、变量或表示式;(3)实参表求值次序与系统相关。第23页二、函数调用详细方式1.
把函数调用作为一个语句
普通形式:
函数名(实际参数表);
惯用于调用一个能够忽略返回值或没有返回值函数。使用情况:
如:对scanf函数和printf函数调用。
2.函数调用出现在表示式(函数表示式)中
普通形式:
变量名=函数表示式使用情况:
用于调用带返回值函数,函数返回值将参加表示式运算。
如:a=3+max(num1,num2);注意:无返回值函数调用,不能出现在表示式中。
第24页三、对被调用函数申明(Functiondeclaration)⒈函数被调用前提条件被调用函数必须是已存在函数,如用户自定义函数或库函数;而且必须事先申明。
同变量一样,函数调用也应该遵照“先说明,后使用”标准。
Likevariables,allfunctioninaCprogrammustbedeclaredbeforetheyareinvoked.第25页2.库函数函数申明(Libraryfunctiondeclaration)
假如使用库函数,需要在文件开头用#include命令将需要库函数包含到文件中。
现在我们清楚了,为何在使用库函数之前必须包含对应头文件?那是因为对这些库函数原型说明全部都写在对应头文件里了。Headfiles(我们现在用到头文件有):#include“stdio.h”/*调用输入输出函数*/#include“math.h”/*调用数学函数*/#include“string.h”/*调用字符,字符串函数*/
在本书附录C中列出了C语言能够使用标准库函数,大约有75个。请在阅读时注意形参要求、功效及返回值。第26页3.用户自定义函数函数申明(User-definedFunction)
Functiondeclarationconsistsoffourparts:Functiontype(returntype)FunctionnameParameterlistTerminatingsemicolonCodedinthefollowingformat:Function-typefunction_name(type1var1,type2var2,……);
Function-typefunction_name(type1,type2,……);
or第27页普通形式:类型标识符函数名(类型1形参1,类型2形参2,……);
类型标识符函数名(类型1,类型2,……);
或在C语言中,以上函数申明称为函数原型(Prototype)。
main(){floatadd(floatx,floaty);floata,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“sumis%f”,c);}/*定义add函数*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}对被调用函数申明作为表示式被调用第28页4.函数申明和函数定义区分
函数申明作用是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便在调用该函数时系统按此进行对照检验。
旧版C语言函数说明只是对函数名及其返回类型说明。如:floatmax();未进行全方面检验,新版C语言兼容这种使用方法,但不提倡使用。所以,以下函数说明都是正当(legal):floatmax(intx,inty);floatmax(int,int);floatmax();
函数定义是指对函数功效确实立,包含指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整、独立函数单位。第29页5.3casesoffunctiondeclarationbeingomitted⑴Returnaintegervalue(函数返回值为整型或字符型时,能够不进行类型说明,系统自动按整型处理)main(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d”,c);}max(intx,inty){intz;z=x>y?x:y;return(z);}无函数说明整型函数第30页⑵Functiondefinedinglobedeclarationsection(函数定义在主调函数之前,能够不进行类型申明)floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b;scanf(“%f,%f,“&a,&b);printf(“sumis%f”,add(a,b));}globedeclarationsection主调函数在被调函数之后第31页⑶Functiondeclaredinglobedeclarationsection(在全部函数定义之前已说明了函数类型,则在各个主调函数中无须对所调用函数再做说明)charletter(char,char);floatf(float,float);inti(float,float);main(){…….}charletter(charc1,charc2){……}floatf(floatx,floaty){……}inti(float,float){……}在全部函数之前说明函数类型此处无须说明定义函数letter、f和i第32页8.5PassingArraystoFunction
(数组作为函数参数)
FunctionArgumentsArrayselement(数组元素能够做函数实参)Arraysname(数组名能够做函数参数)Multi-dimensionalarrays(多维数组)一、数组元素能够做函数实参数组元素能够象变量一样作为表示式组成部分,所以,数组元素能够做函数实参,而且能够单向传递给形参。第33页二、PassingArraystofunctions(数组名能够做函数参数)因为数组名代表就是数组在内存中存放区域首地址。把数组名作为函数参数来实现大量数据传递是一个非常好数据传递方法。说明:数组名做函数实参和形参时不是“值传递”,而是“地址传递”。地址传递结果使得形参加实参共用同一个数组。所以,形参数组各元素值假如发生改变会使实参数组各元素值发生一样改变。第34页/*example*/main(){floatlargest(floata[],intn);floatvalue[4]={2.5,-4.75,1.2,3.67};printf(“%f\n”,largest(value,4));}floatlargest(floata[],intn){inti;floatmax;for(i=1;i<n;i++) if(max<a[i])max=a[i];return(max);}Thearraysshouldbedeclaredrespectivelyinthecallingfunctionandthecalledfunction.Thesizeofactualargumentarraymaynotsimilarwiththeformalone.itisnotnecessarytospecifythesizeofformalargumentarray.
Thetypeofactualargumentarraymustbesimilartotheformalone.第35页2.5-4.751.23.67地址actualargumentvalue[4]
formalargument
a[]value[0]value[1]value[2]value[3]
a[0]a[1]a[2]a[3]
InC,thenameofthearrayrepresentstheaddressofitsfirstelement.Bypassingthearrayname,theaddressofthearrayispassedtothecalledfunction.Thearrayinthecalledfunctionnowreferstothesamearraystoredinthememory.Therefore,anychangesinthearrayinthecalledfunctionwillbereflectedintheoriginalarray.Passingaddressofparametertothefunctionisreferredtoaspassbyaddress.Thewholearraycan’tbepassedbyvalueasitwasdidinthecaseofordinaryvariables.第36页数组名做参数好处(Advantage):⑴因为只需复制一个地址值,而无须复制全部需要处理数据,所以节约存放空间并提升效率。
⑵因为主调函数和被调函数是在相同内存区域上对数据进行操作,所以能够实现数据同时更新。第37页三、多维数组能够做函数参数多维数组元素能够做实参多维数组名能够做参数说明:⑴形参数组定义时必须指定第二维大小如:intarray[3][10];或intarray[][10];但intarray[3][];╳和intarray[][];╳⑵实参数组能够大于形参数组如:实参数组定义为:intarray[5][10];形参数组定义为:intarray[3][10];
这时形参数组只取实参数组一部分,其余部分不起作用。第38页8.6函数嵌套调用(Nestingcalls)
嵌套调用(Nestingcalls):在调用一个函数过程中,该函数又调用其它函数。嵌套定义(Nestingdefinition):在定义一个函数时,该函数体内包含另一个函数定义。
C语言不能嵌套定义,但能够嵌套调用。在调用一个函数过程中,又调用另一个函数。第39页main函数调用A函数结束A函数调用B函数B函数192873456第40页[例8.6]用弦截法求方程根
本例较复杂,重点是了解怎样将复杂问题分解,然后再整合,最终处理问题。x2,f(x2)x1,f(x1)x,f(x)
数学函数(公式)为:y=f(x)=x3-5x+16x-80=0问题可转化为:求曲线与x轴交点x坐标1.解题方法:⑴在曲线上取两点P和Q坐标为(x1,f(x1))和(x2,f(x2)),假如f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一根,反之,改变x1和x2值,直到f(x1)和f(x2)异号为止。第41页⑵求连接P和Q点线段与x轴交点x。x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1))⑶假如f(x)和f(x1)符号相同,(x,x2)区间内必有一根,此时将x作为新x1。假如f(x)和f(x2)符号相同,(x1,x)区间内必有一根,此时将x作为新x2。⑷重复步骤⑵和⑶,不停缩小(x1,x2)距离,同时f(x)越来越趋于0,直到|f(x)|<ε。2.程序设计:函数f(x):求x3-5x2+16x-80函数xpoint(x1,x2):求(x1,f(x1))和(x2,f(x2))连线与x轴交点x。函数root(x1,x2):求(x1,x2)区间内根。第42页程序流程图:求f(x)函数流程图:开始实参值传给形参x函数值y=x3-5x2+16x-80
返回/*定义f函数源程序*/floatf(floatx){floaty;y=x*(x*(x-5.0)+16.0)-80.0;return(y);}求xpoint(x1,x2)函数流程图:开始实参值传给形参x1,x2x=(x1*f(x2)-x2*f(x1))/(f(x2-f(x1)
返回/*定义xpoint函数源程序*/floatxpoint(floatx1,floatx2){floatx;x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return(x);}第43页求root(x1,x2)函数流程图:开始实参值传给形参x1,x2求y1=f(x1)
返回求x=xpoint(x1,x2)
;y=f(x)y*y1>0y1=y
;x1=xx2=x是否fabs(y)≥ε是否/*定义root函数源程序*/floatroot(floatx1,floatx2){floatx,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0001);return(x);}第44页主函数流程图:开始输入x1,x2f1=f(x1),f2=f(x2)f1*f2≥0是x=root(x1,x2)否输出x结束main(){floatf(floatx);floatxpoint(floatx1,floatx2);//函数申明floatroot(floatx1,floatx2);//函数申明
floatx1,x2,f1,f2,x;do{printf(“inputx1,x2:\n”);scanf(“%f,%f”,&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf(“Arootis%8.4f”,x);}注意:因用到库函数fabs,故应在文件开头加上:#include“math.h”第45页main输出根x结束调用rootroot函数xpoint函数f函数调用xpoint调用f11321231141059678上题函数嵌套调用关系:第46页8.7函数递归调用(recursion)
定义:
Recursionisafunctioncallsitself(在调用一个函数过程中直接或间接地调用该函数本身)直接递归调用间接递归调用第47页说明:不应出现无终止递归调用,所以,应该给定一个限制递归次数条件。递归调用对应普通算法:f(x)=终了公式(Terminatedequation)递归公式(Recursionequation)递归函数执行过程:递归调用:记住此次现场,递归调用。终了调用:返回上次调用现场。第48页例:用递归法求n!算法:f(n)=1(n=1)f(n-1)*n(n>1)main(){intn,f;printf(“Inputn:”);scanf(“%d”,&n);f=jx(n);printf("\nn!=%d",f);}intjx(intn){intf;if(n==1)f=1;elsef=jx(n-1)*n;returnf;}第49页main输出f=6结束调用jx(3)Jx(n)函数Jx(n)函数Jx(n)函数调用Jx(2)调用jx(1)Jx(3)=jx(2)*3Jx(3)=jx(2)*3=1*2*3Jx(2)=jx(1)*2=1*2Jx(2)=jx(1)*2上题函数嵌套调用关系:f=1Jx(1)=1第50页8.8Localvariablesandglobalvariables
(局部变量和全局变量)
一、局部变量(Localvariables)定义:在函数内部或复合语句内部定义变量,称作局部变量。(bedefinedinsideafunctionoranestedblock)作用域:函数内或复合语句(NestedBlock)内。注意:⑴主函数main定义变量只在主函数中有效,主函数不能使用其它函数定义变量。⑵不一样函数中同名变量互不影响。⑶形参也是局部变量。
第51页例1:voidfunction1(void) voidfunction2(void); main() { intm=1000; function2(); printf(“%d\n”,m); }/*第三次输出*/ voidfunction1(void) { intm=10; printf(“%d\n”,m); }/*第一次输出*/ voidfunction2(void) { intm=100; function1(); printf(“%d\n”,m); }/*第二次输出*/
运行结果:10
100
1000
第52页例2:
main(){inta=20,b=10;….{inta=0;intc=a+b;a、b在此
…c在此范围范围内有效内有效}b=a;}运行结果:a=20
b=20
c=10
第53页二、全局变量(globalvariables)定义:在函数外部定义变量称作全局变量(也称外部变量)。(Thevariableswhicharedeclaredoutsideallfunctionsarereferredtoasglobalvariables
orexternalvariables)
作用域:可认为本文件中全部函数公用。Canbequotedbyallfunctionsinthisfile.注意:⑴从定义变量位置开始到本文件结束,这段程序中函数可直接使用外部变量。⑵假如在定义点之前函数想使用外部变量,则应该在该函数中用关键字extern作“外部变量”说明。第54页intp=1,q=5;//全局变量floatf1(inta)/*定义函数f1*/{intb,c;…}charc1,c2;//全局变量charf2(intx,inty)/*定义函数f2*/{inti,j;…}voidmain()/*主函数*/{intm,n;…}全局变量 p,q作用范围全局变量c1,c2作用范围第55页externc2;intp=1,q=5;//全局变量floatf1(inta)/*定义函数f1*/{intb,c;…}charc1,c2;//全局变量charf2(intx,inty)/*定义函数f2*/{inti,j;…}voidmain()/*主函数*/{intm,n;…}全局变量 p,q,c2作用范围全局变量c1作用范围第56页intp=1,q=5;//全局变量floatf1(inta)/*定义函数f1*/{intb,c;…}charc1,c2;//全局变量charf2(intx,inty)/*定义函数f2*/{inti,j;intp=3,q=9;…}voidmain()/*主函数*/{intm,n;…}全局变量 p,q作用范围全局变量c1,c2作用范围第57页从程序设计观点看使用全局变量
:优点:(1)增加了函数间数据联络同一文件中一些函数引用全局变量,当某个函数中改变了全局变量值,其它函数中全局变量值也随之改变。(2)函数能够得到多个返回值。(3)全局变量在程序全部执行过程中都占用存放单元。⑶假如在同一源文件中,全局变量和局部变量同名,则在局部变量作用范围内,全局变量不起作用。第58页⑴全局变量在程序全部执行过程中都占 用存放单元。⑵使用全局变量不符合程序设计中要求模块 间“强内聚性、弱耦合性”标准。⑶使用全局变量过多,会降低程序可读性 和可维护性。缺点:第59页8.9变量存放类别(storageclass)一、Staticstorageanddynamicstorage静态存放方式:程序运行期间分配固定存放空间方式(fixedmemory)动态存放方式:程序运行期间依据需要进行动态分配存放空间方式(changeablememory)程序区静态存放区动态存放区全局变量,局部静态变量形式参数局部变量(自动)函数调用现场保护和返回地址第60页二、Staticvariablesanddynamicvariables静态存放变量:用静态存放方式存放变量。
特点:在静态存放区分配存放单元,整个程序运行期间都不释放。动态存放变量:用动态存放方式存放变量。
特点:函数开始调用时为变量分配存放空间,函数结束时释放这些空间。一个程序两次调用同一函数,其中同一个局部变量内存地址可能不一样。第61页C语言变量属性:数据类型存放类型存放类型:数据在内存中存放方式。即静态存放方式和动态存放方式。经过存放分类符来表示。三、变量属性及其定义数据类型:整型,实型,字符型……变量按存放类别分类:(storageclass)automaticvariables(自动变量)register
variables
(存放器变量)static
variables
(静态变量)extern
variables
(外部变量)第62页上述变量属性:作用域(Scope),生存期(Longevity),可见性(Visibility)作用域:变量能够使用程序范围(active)生存期:变量在程序执行一段时间内保持存活状态(alive)可见性:变量可从内存中存取特征(accessible)定义变量普通形式:存放分类符类型标识符变量名;如:autointa;staticintb;registerintd;Storage-classtypevariables_name;第63页1.automatic
variables(自动变量)四、变量存放类型automaticvariablescomesintobeingandendsinthefunctionatwhichtheyaredeclared.自动变量在它们所使用函数中申明,随函数调用而生成,而当退出函数时自动终止,因而得名自动变量。自动变量是它们所在函数局部变量,因而被称为局部变量或内部变量Variablesdeclaredinsideafunctionwithoutclassspecificationareautomaticonesbydefault.函数中定义变量假如没有存放类型申明,则隐含指定为自动变量,数据存放在动态存放区中,属于动态存放变量。程序中大多数变量属于自动变量第64页说明:⑴在一个函数内假如局部变量不作存放类型说明,均为自动变量;⑵形式参数缺省存放类型是auto,但不能将auto加在形参说明之前。如:intb,c=3等价于autointb,c=3;如:intmax(autointx,autointy){……}╳自动变量定义为autointa;第65页2.static
variables
(静态变量)Thelongevitylastfromitsdefinitionuntilltheprogramended.静态变量生存期为从其定义开始到整个程序结束Staticcandeclarelocalvariablesandexternalones.static可用于说明静态局部变量和静态全局变量第66页静态局部变量(Staticlocalvariables)
(1)definition:insidethefunction定义:在函数内部定义(2)scope:inthefunctionatwhichitwasdeclared.
作用域:定义它函数内部。(3)longevity:Entireprogram(Global)生存期:存放在静态存放区,整个程序运行期间都不释放。
而自动变量在函数调用结束后即释放。第67页(5)假如静态局部变量不赋初值,编译时自动赋0。
而自动变量不赋初值,其值不确定。提醒:尽可能少用静态局部变量!比如:打印1!~5!intfac(intn){staticintf=1;f=f*n;return(f)}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));}(4)usage:initializedwhencomplied,butnolongerinitialized
whencallingit.使用:编译时赋初值,每次调用时不再赋初值,只保留调用结束时变量值。
而自动变量调用一次,重新赋值一次。第68页静态全局变量(Staticglobalvariables)
(1)declaration:outsideallfunctions定义:在全部函数之外定义(2)scope:canbequotedbyallfunctionsinthefileatwhichitwasdeclared,butcan’tbequotedbyotherfiles.作用域:能够被本程序文件中全部函数使用,而不能被其它程序文件引用。(3)longevity:Entireprogram(Global)生存期:整个程序运行期间,编译时分配在静态存放区(不论是否加static说明)。(4)静态全局变量与普通全局变量区分: 静态全局变量只能被它定义时所在文件使用,而普通全局变量能被其它文件使用。第69页3.register
variables
(存放器变量)存放器:它是CPU中运算器组成部分,用来暂时存放数据存放装置。存放器变量:直接放置在运算器存放器中变量称为存放器变量。引入存放器变量是为了提升“存取”速度。⑵存放器变量属于动态存放变量,但并不放在动态存放区中,它放在存放器中。⑴register只适合用于说明局部变量;比如:registerinti;定义了i是存放器变量,其数据类型是整型。第70页说明:⑶存放器变量作用域与自动变量相同。⑵因为计算机存放器数目有限,不宜定义太多存放器变量。不一样系统允许使用存放器个数是不一样。⑴只有局部变量(非静态)和形式参数能够作为存放器变量。比如:registerstaticinti;╳第71页4.external
variables
(外部变量)⑴Longevityandscope:Externalvariablesarealiveandactiveduringtheentireprogram,andareknownasglobalvariable.生存期与作用域:在整个程序运行期间都“存活”和“有效”变量称为外部变量;也称为全局变量。⑵Insideamulti-fileprogram:在多个源程序文件组成程序中第72页/*文件A.c*/inta;main(){……}比如:/*文件B.c*/externinta;power(){……}也能够写成externa;假如在B文件中引用在A文件中定义全局变量(该
全局变量不是static变量),则需要在B文件中,用关键字extern说明。IfBfilewantexcerptavariabledefinedinAfile,Bfilemustdeclareitasextern.Thatexterndeclarationdoesnotallocatestoragespaceforvariables.第73页若在A文件中全局变量是静态外部变量(static),则即使在B文件中用extern对其说明,也无法在A文件中使用该全局变量。/*文件A.c*/staticinta;main(){……}比如:/*文件B.c*/externinta;power(){……}无法使用变量a第74页(3)在同一个源文件中,全局变量作用域之外函数中使用该全局变量时,也需用extern对其说明。Intheprogramsegmentbelowleft,themaincannotaccessthevariableyasithasbeendeclaredafterthemainfunction.Theproblemcanbesolvedbydeclaringthevariablewiththestorageclassextern.main(){inty;…}inty=5;func1(){y=y+1;}main(){externinty;…}inty=5;func1(){……}main(){inti;voidprint_out();externfloatheight[];…print_out();}voidprint_out()//函数申明{externfloatheight[];……}floatheight[SIZE];第75页8.10内部函数和外部函数
一、内部函数(LocalFunction)定义:假如一个函数只能被本文件中其它函数调用,称为内部函数(又称静态函数)。Wewouldlikeaparticularfunctiontobecalledonlybythefunctioninthefileatwhichitisdeclared,otherthantobecalledbyanyfunctionsinotherfiles.Thiscanbeaccomplishedbydeclaringthefunctionwiththestorageclassstatic.格式:static类型标识符函数名(形参表)staticfunction-typefunction_name(argumentlist)第76页比如:staticintfun(a,b){..….}作用:函数作用域限于所在文件,不一样文件中同名函数互不干扰,便于程序局部化。第77页二、外部函数(ExternalFunction)定义:假如一个函数允许被其它文件调用,称为外部函数。Functionareexternalby
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 残疾人移位专用吊索市场需求与消费特点分析
- 2024年度合作协议:线上线下融合营销合作合同
- 2024年度物业管理合同:物业安保与服务质量
- 2024年度光伏项目EPC合同包含设计、采购、施工
- 氨吸入剂项目评价分析报告
- 2024年度技术服务担保合同
- 2024年度城市道路标志涂装承包合同
- 2024年度成都物业服务费用结算合同
- 载客电梯用马达市场需求与消费特点分析
- 运载工具座椅用儿童安全带市场发展预测和趋势分析
- 班主任工作经验分享如何成为优秀的班主任
- 线路检测报告
- 古诗文系列课件模板-山房春事二首
- 2024年上海市第二十七届初中物理竞赛初赛试题及答案
- 2011年认识实习报告
- 水务公司招聘笔试题库及答案
- 房建施工测量培训课件
- 医疗垃圾分类与处理的人员培训与资质要求
- 审核的改进计划和措施
- 艾滋病的危害
- 《旅游管理》专业调研报告
评论
0/150
提交评论