下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 08_第08章 函数

08_第08章 函数.ppt

08_第08章 函数

tianxingmeizhou
2010-12-15 0人阅读 举报 0 0 暂无简介

简介:本文档为《08_第08章 函数ppt》,可适用于工程科技领域

第章函数第章函数本章学习要点:掌握函数的定义方法掌握函数的类型和返回值掌握形式参数与实际参数、参数传递掌握函数的正确调用了解函数的递归调用掌握局部变量和全局变量、变量的存储类型作用域和生存期概述函数:英文名为Function,直译为“功能”,“函数”的意思在C语言里,函数指的是实现一个特定功能的程序模块它相当于其他语言中的子程序一个C语言程序可由一个主函数和若干个函数构成,其中主函数是不可缺省的每个C程序由主函数调用其他函数,其他函数也可以相互调用在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用main函数a函数e函数f函数g………函数b函数h函数I函数J………函数c函数K函数L函数M………main(){voidprintstar()voidprintmessage()printstar()printmessage()printstar()}voidprintstar(){printf(“***********************n”)}voidprintmessage(){printf(“Howdoyoudo!n”)}说明:)源程序文件可由一个或多个函数组成,其中主函数是不可缺省的源程序文件是编译单位,函数不是编译单位)一个C程序由一个或多个源程序文件组成较大的C程序,常将一些函数和其他内容分别放在若干源文件中,再由若干源文件组成一个C程序最简单的情况,一个C程序由一个源程序组成,这个源程序中只包含了一个函数主函数)C程序的执行从main函数开始,在main函数中结束)所有函数在定义时是相互独立的,函数之间可以相互引用但不能嵌套定义函数的分类:)从用户使用的角度函数可分为:标准函数:即库函数由系统提供,用户不必定义,直接使用用户自定义函数:由用户根据需要,自行编写,以解决专门需要)从函数的形式分,函数可分为:无参数函数:在调用无参函数时,主函数并不将数据传送给被调用函数,一般用来执行指定的一组操作无参函数可以带回也可以不带回函数值,一般以后者居多有参函数:在调用函数时,在主函数和被调用函数之间有数据传递函数定义的一般形式函数定义的一般形式无参函数的定义形式类型标识符函数名(){声明部分语句}其中用“类型标识符”指定函数值的类型即函数带回来的类型无参函数一般不需要带回函数值,因此可以不写类型标识符有参函数定义的一般形式类型标识符函数名(形式参数表列){声明部分语句}例如:intmax(intx,inty){intzz=x>yx:yreturn(z)}可以有“空函数”形式为:类型说明符函数名(){}例如:dummy(){}调用此函数时,什么工作也不做,没有任何实际作用此中空函数的使用一般用于程序设计的模块设计阶段函数参数和函数的值函数参数和函数的值形式参数和实际参数、形式参数(形参):函数定义时设定的参数。下例中函数头intmax(intx,inty)中x,y就是形参它们的类型都是整型。 、实际参数(实参):调用函数时所使用的实际的参数。下例中主函数中调用max函数的语句是:nmax=max(a,b)其中a,b就是实参它们的类型都是整型。例调用函数时的数据传递main(){inta,b,cscanf(“d,d”,a,b)c=max(a,b)printf(“Maxisd”,c)}intmax(intx,inty){intzz=x>yx:yreturn(z)}运行情况如下:,Maxis实参a,b形参x,y关于形参和实参的说明()只用在发生函数调用时,形参才被分配内存单元在调用结束后,形参所占的内存单元也被释放()实参可以是常量,变量或表达式,如:max(,ab)但要求它们有确定的值在调用时将实参的值赋给形参()在被定义的函数中,必须指定形参的类型()实参和形参的类型应相同或赋值兼容,否则会出错()C语言规定,实参对形参变量的数据传递是“值传递”,即单向传递,只能由实参传给形参,而不能由形参传回来函数的返回值通常,希望通过函数调用使主调函数得到一个确定的值,这就是函数的返回值例如例说明:()函数的返回值是通过函数中的return语句获得的()一个函数中可以有一个以上的return语句执行到那一句那一句起作用。()return语句后的括号可以不要例如:returnz和return(z)是等效的()函数返回值的类型应当在定义函数值时指定在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致,如果不一致,则以函数类型为准()如果被调用函数中没有return语句,并不带回一个确定的、用户所希望的值带回的是一个不确定的值。C语言允许用户把该值赋给变量()为了明确表示“不带回值”,可以用“void”定义无类型例如:例中的定义可以改为:voidprintstar(){……}voidprintmessage(){……}这样,系统就保证不使函数带回任何值,即禁止在主调函数中使用被调用函数的返回值例如:a=printstar()b=printmessage()是不合法的函数的调用函数的调用函数调用的一般形式函数调用的一般形式为:函数名(实参表列)说明:()如果是调用无参函数,则“实参表列”可以没有,但括号不能省略()如果实参表列多个实参,则各参数间用逗号隔开,实参与形参的个数应相等,类型应一致在TurboC中,对实参求值的顺序是按自右至左顺序求值的。见例。函数调用的方式按函数在程序中出现的位置来分,可以有以下三种函数调用方式:函数语句把函数调用作为一个语句如例中的printstar()这种不要求函数带回值,只要求函数完成一定的操作函数表达式函数出现在一个表达式中,这种表达式称为函数表达式,这是要求函数带回一个确定的值参加表达式的运算例如:c=*max(a,b)函数参数函数调用作为一个函数的实参这种调用的实质也是函数表达式调用的一种例如:m=max(a,max(b,c))其中max(b,c)是一次函数调用它的值作为max另一次调用的实参。对被调用函数的声明和函数原型对被调用函数的声明和函数原型在一个函数中调用另一个函数需要具备的条件:()首先被调用的函数必须是已经存在的函数(库函数或用户自己定义的函数)()如果使用库函数一般还应该在本文件开头用#include命令将调用有关库函数时所用到的信息“包含”到本文件中来。例如:#include<stdioh>其中“stdioh”是一个“头文件”在stdioh文件中放了输入输出库函数所用到的一些宏定义。如果不包含“stdioh”文件中的信息就无法使用输入输出库中的函数。同样使用数学库中的函数应该用:#include<mathh>()如果使用用户自己定义的函数函数调用与函数定义前一般还应该在主调函数中对被调用函数作声明。例main(){floatadd(floatx,floaty)floata,b,cscanf(“f,f”,a,b)c=add(a,b)printf(“sumisf”,c)}floatadd(floatx,floaty){floatzz=xyreturn(z)}对被调用函数的声明。从此行开始为对被调用函数的定义。包括函数首部、函数体等。函数声明也称为函数原型其作用主要是在程序的编译阶段对调用函数的合法性进行全面检查。在函数声明中也可以不写形参名而只写形参的类型。如上例中可以这样进行函数声明:floatadd(float,float)函数原型的一般形式为:()函数类型函数名(参数类型,参数类型……)()函数类型函数名(参数类型参数名,参数类型参数名……)编译系统不检查参数名。因此上例程序中函数声明可以写成:floatadd(floata,floatb)应当保证函数原型与函数首部写法上的一致即函数类型、函数名参数个数参数类型和参数顺序必须相同。函数调用时函数名、实参个数应与函数原型一致。实参类型必须与函数原型中的参数类型赋值兼容。如果被调用函数的定义出现在主调函数之前可以不必加以声明。函数的嵌套调用函数的嵌套调用C语言的函数定义都是互相平行、独立的。C语句不能嵌套定义函数但可以嵌套调用函数也就是说在调用一个函数的过程中又调用另一个函数。下图表示的是两层嵌套(连main函数共层函数)其执行过程见图。开始调用a函数结束开始调用b函数结束开始结束main函数a函数b函数具体的例子请参考P例函数的递归调用函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。例如:intf(intx){inty,zz=f(y)return(*z)}在调用函数f的过程中又要调用f函数这是直接调用本函数见图。开始调用f函数f函数在调用f函数过程中要调用f函数而在调用f函数过程中又要调用f函数。从图上可以看到这两种递归调用都是无终止的自身调用。可以用if语句来控制只有在某一条件成立时才继续执行递归调用否则就不再继续。f函数f函数例有个人坐在一起问第个人多少岁?他说比第个人大岁。问第个人岁数他说比第个人大岁。问第个人又说比第个人大岁。问第个人说比第个人大岁。最后问第个人他说是岁。请问第个人多大。显然这是一个递归问题。每一个年龄都比其前个人的年龄大岁.即age()=age()age()=age()age()=age()age()=age()age()=因此除了第一个人其余的人的年龄都需用递归法求出。执行过程如下:age函数n=mainage()输出age()c=age()age函数n=c=age()age函数n=c=age()age函数n=c=age()age函数n=c=age()=age()=age()=age()=intage(intn)*递归函数*{intcif(n==)c=elsec=age(n)return(c)}main()*主函数*{printf(“d”,age())}递归结束条件递归公式递归函数编写总结:)采用if语句格式)两要素:递归结束条件递归公式)一般形式if(递归结束条件)else递归公式)递归公式中包含递归函数名但参数不同)if语句前的语句在递归进入时执行if语句后的语句在递归返回时执行例用递归的方法求n!递推法:从开始乘乘……一直乘到n。其基本原理是从一个已知事实推出下一个事实。递归法:当n=或时n!=当n>时n!=n*(n)!。floatfac(intn){floatfif(n<)printf(“n<,dataerror!”)elseif(n==||n==)f=elsef=fac(n)*nreturn(f)}main(){intnfloatyprintf(“inputaintegernumber:”}scanf(“d”,n)y=fac(n)printf(“d!=f”,n,y)}例汉诺塔问题数组作为函数参数数组作为函数参数数组元素作为函数实参数组元素作函数实参:“值传递”方式即单向传递。用法与变量相同。例有两个数组ab各有个元素将它们对应地逐个相比。如果a数组中的元素大于b数组中的相应元素的数目多于b数组中元素中大于a数组中相应元素的数目则认为a数组大于b数组并分别统计出两个数组相应元素大于、等于、小于的次数。分析:)对于两个数组中的元素比较结果我们可以用个变量来记录)为了保持程序的简洁用一个函数来进行数组元素的比较比较结果用该函数的返回值表示。main(){intlarge(intx,inty)inta,b,i,n=,m=,k=printf(“enterarraya:n”)for(i=i<i)scanf(“d”,ai)printf(“n”)printf(“enterarrayb:n”)for(i=i<i)scanf(“d”,bi)printf(“n”)for(i=i<,i){if(large(ai,bi)==)n=nelseif(large(ai,bi)==)m=melsek=k}printf(“ai>bidtimesnai=bidtimesnai<bidtimesn”,n,m,k)if(n>k)printf(“arrayaislargerthanarraybn”)if(n<k)printf(“arrayaissmallerthanarraybn)”elseprintf(“arrayaisequaltoarraybn)”}intlarge(intx,inty){intflagif(x>y)flag=elseif(x<y)flag=elseflag=return(flag)}输入数组a和数组b的数据调用large函数进行数组元素比较large函数返回比较结果数组名可作函数参数数组名可作函数参数此时实参与形参应用数组名或指针变量。此时传递的是数组首个元素的地址。例有一个一维数组score内放个学生成绩求平均成绩。floataverage(floatarray){intifloataver,sum=arrayfor(i=i<i)sum=sumarrayiaver=sumreturn(aver)}main(){floatscore,averintiprintf(“inputscore:n”)for(i=i<i)scanf(“f”,scorei)printf(“n”)aver=average(score)printf(“averagescoreisf”,aver)}说明:)用数组名作函数参数应该在主调函数和被调用函数分别定义数组不能只在一方定义)实参数组与形参数组类型应一致否则出错)实参数组与形参数组大小可以一致也可以不一致C编译对形参数组大小不作检查只是将实参数组的首地址传给形参数组)形参数组也可以不指定大小在定义数组时在数组名后面跟一个空的方括弧为了在被调用函数中处理数组元素的需要可以另设一个参数传递数组元素的个数。参见P例)数组名作函数实参不是值传递而是地址传递实参和形参数组将共占用同一段内存单元如果形参数组中各元素发生变化会使实参数组元素的值同时发生变化。例用选择法对数组中个整数按由小到达排序。选择法介绍:)将个数进行相互比较找出最小数将之与a对换)再将a到a的数进行比较找出最小数将之与a对换)……共比较轮最后得到排序后的结果以个数为例说明:aaaaa未排序时的情况将个数中最小数与a对换将余下的个数中最小数与a对换将余下的个数中最小数与a对换将余下的个数中最小数与a对换至此完成排序voidsort(intarray,intn){inti,j,k,tfor(i=i<ni){k=ifor(j=ij<nj)if(arrayj<arrayk)k=jt=arraykarrayk=arrayiarrayi=t}}main(){inta,iprintf{“enterthearrayn”)for(i=i<i)scanf(“d”,ai)sort(a,)printf("thesortedarray:n")for(i=i<i)printf(“d”,ai)printf(“n”)}变量k用于记录最小数的位置初始值为i变量i用于记录进行选择排序的数的起始位置初始值为第一个数的位置。用多维数组名作函数参数用多维数组作为实参和形参遵循“地址传递”形参值变化影响实参值变化在被调用函数中对形参数组定义时可以指定每一维的大小也可以省略第一维的大小说明从实参传递来的是数组起始地址在内存中按数组排列规则存放(按行存放)并不区分行和列因此不能省略第二维注意:二维数组的一维表示时其元素与一维数组等同。局部变量和全局变量局部变量和全局变量局部变量在一个函数内部定义的变量是内部变量只在本函数范围内有效在此函数之外是不能使用这些变量成为局部变量。floatf(inta){intb,c……}charf(intx,inty){inti,j……}main(){intm,n……}变量a,b,c有效变量x,y,i,j有效变量m,n有效说明:()主函数main中定义的变量(如m,n)也只在主函数中有效而不因为在主函数中定义而在整个文件成程序中有效这是和Pascal不同的。主函数也不能使用其他函数中定义的变量。()不同函数中可以使用相同名字的变量它们代表不同的对象互不干扰。()形式参数也是局部变量例如fl函数中的形参a也只在fl函数中有效。其他函数不能调用。()在一个函数内部可以在复合语句中定义变量这些变量只在本复合语句中有效这种复合语句也可称为“分程序”或“程序块”main(){inta,b……{intcc=ab……}……}变量c只在复合语句内有效离开后就无效释放内存单元。变量a,b在此范围有效全局变量全局变量程序的编译单位是源程序文件一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量而在函数之外定义的变量称为外部变量外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。intP=,Q=floatf(a)inta{intb,c……}charC,Ccharf(intx,inty){inti,j……}main(){intm,n……}全局变量C,C的作用范围全局变量P,Q的作用范围说明:全局变量的主要作用时增加了函数间数据联系的渠道。同一文件中的函数都可以使用全局变量如果在一个函数中改变了全局变量的值将影响到其他函数。为了便于区别全局变量和局部变量一般约定全局变量的第一个字母用大写建议不在必要时不要使用全局变量因为:①全局变量在程序的全部执行过程中都占用存储单元而不是仅在需要时才开辟单元。②它使函数的通用性降低了因为函数在执行时要依赖于其所在的外部变量如果将一个函数移到另外文件中还要将有关的外部变量及其值一起移过去但若该外部变量与其他文件的变量同名时就会出现问题降低了程序的可靠性和通用性在程序设计中在划分模块时要求模块的”内聚性”强、与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多互不相关的功能放到一个模块中).与其他模块的相互影响要尽量少而用全局变量是不符合这个原则的一般要求把程序中的函数做成一个封闭体除了可以通过”实参形参”的渠道与外界发生联系外没有其他渠道。这样的程序移植性好可读性强。③使用全局变量过多会降低程序的清晰性人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值。程序容易出错。因此要限制使用全局变量。如果在同一个源文件中外部变量与局部变量同名则在局部变量的作用范围内外部变量会被“屏蔽”即它不起作用。例外部变量与局部变量同名。inta=,b=max(inta,intb){intcc=a>ba:breturn(c)}main(){inta=printf(“d”,max(a,b))}结果为:a,b为全局变量a,b为局部变量形参a,b作用范围局部变量a作用范围全局变量b作用范围变量的存储类别变量的存储类别动态存储方式与静态存储方式按作用域来分:全局变量和局部变量。按变量值生存期来分:静态存储方式、动态存储方式。静态存储方式:在程序运行期间分配固定的存储空间的方式动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式。内存中的供用户使用的存储空间的情况。这个存储空用户区间。分为三部分见图。程序区静态存储区动态存储区用户区全局变量全部存放在静态存储区:非动态地进行分配和释放在程序开始执行时给全局变量分配存储区程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元。动态存储区中存放以下数据:函数形式参数。自动变量(未加static声明的局部变量)。函数调用时的现场保护和返回地址等。动态地进行分配和释放。在函数调用开始时分配动态存储空间函数结束时释放这些空间。在C语言中每一个变量和函数有两个属性:数据类型和数据存储类别。数据类型包括整型、字符型等。存储类别措的是数据在内存中存储的方法存储方法分为两大类:静态存储类和动态存储类。具体包含四种:自动的(auto)静态的(static).寄存器的(register)外部的(extern)根据变量的存储类别可以知道变量的作用域和生存期。auto变量auto变量函数中的局部变量如不专门声明为static存储类别都是动态地分配存储空间的数据存储在动态存储区中在函数调用结束时就自动释放这些存储空间因此这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。例如:intf(inta)*定义f函数a为形参*{autointb,c=*定义b,c为自动变量*……}实际上关键字“auto”可以省略auto不写则隐含确定为“自动存储类别”。程序中大多数变量属于自动变量。我们前面介绍的函数中定义的变量都没有声明为auto其实都隐含指定为自动变量。用static声明局部变量用static声明局部变量有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值即其占用的存储单元不释放在下一次该函数调用时该变量已有值就是上一次函数调用结束时的值。这时就应该指定该局部变量为”静态局部变量”用关键字static。进行声明。例intf(inta){autointb=staticintc=b=bc=creturn(abc)}main(){inta=,ifor(i=i<i)printf(“d”,f(a))}运行结果为:说明:)静态局部变量属于静态存储类别在静态存储区内分配存储单元在程序整个运行期间都不释放)对静态局部变量是在编译时赋初值的在程序运行时它已有初值以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。自动变量赋初值不是在编译时进行而是在函数调用时进行每调用一次函数重新给一次初值相当于执行一次赋值语句)如在定义局部变量时不赋初值的话对静态局部变量编译时自动赋初值(对数值型变量)或空字符(对字符变量)。而对自动变量来说如果不赋初值则它的值是一个不确定的值。)虽然静态局部变量在函数调用结束后仍然存在但其他函数是不能引用它的。使用局部静态变量一般情况:()需要保留函数上一次调用结束时的值。()如果初始化后变量只被引用而不改变其值则这时用静态局部变量比较方便以免每次调用时重新赋值。但是应该看到用静态存储要多占内存而且降低了程序的可读性当调用次数多时往往弄不清静态局部变量的当前值是什么。因此如不必要不要多用静态局部变量。register变量register变量一般情况下变量(包括静态存储方式和动态存储方式)的值是存放在内存中的当程序中用到哪一个变量的值时由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算如果需要存数再从运算器将数据送到内存存放。如果有一些变量使用频繁则从内存存取数据将花费较多时间。为了提高执行效率C语言允许将局部变量的值放在CPU中的寄存器中。由于对寄存器的存取速度远高于对内存的存取速度因此这样就可以提高执行效率。这种变量叫做”寄存器变量”用关键字register作声明内存CPU总线运算器控制器寄存器例使用寄存器变量intfac(intn){registerinti,f=for(i=i<=ni)f=f*ireturn(f)}main(){intifor(i=i<=i)printf(“d!=dn”,i,fac(i))}说明:))只有局部自动变量和形式参数可以作为寄存器变量其他(如全局变量)不行。)一个计算机系统中的寄存器数目是有限的不能定义任意多个寄存器变量。)不同的系统对寄存器变量的处理方法是不同的有的系统对寄存器当自动变量处理分配内存单元有的系统只允许将intchar和指针型变量定义为寄存器变量当今的优化编译系统能够识别使用频繁的变量从而自动地将这些变量放在寄存器中而不需要程序设计者指定)局部静态变量不能定义为寄存器变量。用extern声明外部变量用extern声明外部变量外部变量(即全局变量)是在函数的外部定义的它的作用域为从变量的定义处开始到本程序文件的未尾。在此作用域内全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。有时需要用extern来声明外部变量以扩展外部变量的作用域在一个文件内声明外部变量如果外部变量不在文件的开头定义其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明就可以从“声明”处开始合法使用该外部变量。在多文件的程序中声明外部变量一个C程序可以由一个或多个源程序文件组成。如果程序只由一个源文件组成使用外部变量的方法如前面介绍。如果一个程序包含两个文件在两个文件中都要用到同一个外部变量不能分别在两个文件中对该变量各自定义否则进行程序的连接时会出现“重复定义”的错误。正确的做法是:在任一个文件中定义该变量而在另一文件中用extern对该变量作“外部变量声明”在编译和连接时系统会由此知道此变量是一个已在别处定义的外部变量并将在另一文件中定义的外部变量的作用域扩展到本文件在本文件中可以合法地引用外部变量。例给定b的值输入a和m求a*b和am的值。文件filec中的内容:intA*定义外部变量*main(){inputpower(int)*对调用函数作声明*intb=,c,d,mprintf(“enterthenumberaanditspowerm:n”)scanf(“d,d”,a,m)c=A*bprintf(“d*d=dn”,A,b,c)d=power(m)printf(“d*d=d”,A,m,d)}文件filec中的内容:externA*声明A为一个已定义的外部变量*power(intn){inti,y=for(i=i<=ni)y=y*Areturn(y)}说明:)假如程序有个源文件在一个文件中定义外部整型变量A其他个文件都可以引用A但必须在每一个文件中都加上一个externA声明。在各文件经过编译后将各目标文件链接成一个可执行的目标文件)在编译时遇到extern时先在本文件中找外部变量的定义如果找到就在本文件中扩展作用域如果找不到就在链接时从其他文件中找外部变量的定义如果找到就将作用域扩展到本文件。如果找不到按出错处理。用static声明外部变量用static声明外部变量有时在程序设计中希望某些外部变量只限于被本文件引用而不能被其他文件引用。这时可以在定义外部变量时加一个static声明。这种加上static声明只能用于本文件的外部变量(全局变量)称为静态外部变量。这为程序的模块化、通用性提供方便。如果已知道其他文件不引用本文件的外部变量可以对本文件中的外部变量都加上static成为静态外部变量以免彼其他文件误用。需要指出对外部变量加上static声明并不意味着这时才是静态存储(存放在静态存储区中)而不是static的是动态存储(存放在动态存储区)。两种形式的外部变量都是静态存储方式只是作用范围不同而已都是在编译时分配内存的。内部函数和外部函数内部函数和外部函数函数本质上是全局的因为一个函数要被另外函数调用。但是也可以指定函数不能被其他文件调用。根据函数能否被其他源文件调用将函数区分为内部函数和外部函数。内部函数如果一个函数只能被本文件中其他函数所调用它称为内部函数。在定义内部函数时在函数名和函数类型的前面加static。即static类型标识符函数名(形参表)例如:staticintfun(inta,intb)内部函数义称静态函数。使用内部函数可以使函数只局限于所在文件如果在不同的文件中有同名的内部函数互不干扰这样不同的人可以分别编写不同的函数而不必担心所用函数是否会与其他文件中函数同名。外部函数在定义函数时如果在函数首部的最左端冠以关键字extern则表示此函数是外部函数可供其他文件调用。如函数首部可以写为externintfun(inta,intb)这样函数fun就可以为其他文件调用。C语言规定如果在定义函数时省略extern则隐含为外部函数。本书前面所用的函数都是外部函数。利用函数原形也能够把函数的作用域扩展到定义该函数的文件之外而不使用extern。只要在使用该函数的每一个文件中包含该函数的函数原型即可。最常用的方法是使用#include命令。在TurboC中运行一个多文件程序在TurboC中运行一个多文件程序设有一个程序包含个文件:filec,filec,filec,filec。步骤:)先后输入编辑个文件并分别以文件名filec,filec,filec,filec存储在磁盘上。)建立一个“项目文件”它不包括任何程序语句而只包括组成程序的所有的文件名。即filecfilecfilecfilec扩展名C可以省写。个文件顺序任意。可以连续写在同一行上如:filefllelfilefile如果这些源文件不在当前目录下应指出路径。)将以上内容存盘文件名自定但扩展名必须为prj(表示为project文件)。设文件名为aprj。在TurboC主菜单中选择project菜单按回车键后出现下拉菜单找到其中的Pprojectname项并按回车键输入项目文件名aprj以代替*prj表示当前准备编译的是aprj中包括的文件。)进行编译连接系统先后将个文件翻译成目标文件把它们连接或一个可执行文件aexe(文件名主于与项目文件相同)。)按Ctrl+F键即可运行可执行文件aexe。用#include命令将filec、filec和filec包含到filec中。在filec中的开头加行:#include“filec”#include“filec”#include“filec”这时在编译时系统自动将这个文件放到main函数的前头作为一个整体编译而不是分个文件编译。这时这些函数被认为是在同一文件中不再是作为外部函数被其他文件调用了。main函数中原有的extern声明可以不要。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/61

08_第08章 函数

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利