版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章函数本章内容函数的定义和返回值函数的调用和声明标准函数123函数的参数4函数的嵌套调用和递归5变量的存储类别6函数一个C语言源程序通常由一个主函数和若干个子函数组成,各子函数之间的关系是平行的,因此不能嵌套定义,但能相互调用。一个C语言源程序无论包含了多少个函数,程序的执行总是从主函数main()开始,并终止于主函数main()。从用户使用的角度将函数分为两种:标准函数(库函数)和用户自定义函数。6.1函数的定义和返回值1、函数定义的一般形式:
[类型标识符]函数名([形式参数表])
{[函数体]}函数名:由用户命名,命名规则与标识符命名规则相同。类型标识符:
定义了函数返回值的数据类型。当函数的返回值是整形或字符型,可省略类型标识符。当函数无返回值时,则类型标识符用void关键字。
形式参数表的一般形式为:
类型标识符形参1,类型标识符形参2,···若省略形式参数表,则称为无参函数。否则称为有参函数。函数体:包含了说明语句和执行语句。当函数无函数体时,则为空函数。函数的返回值2、函数的返回值
函数的返回值是通过return语句实现的。格式:return(表达式);或return表达式;语义:当函数执行到return语句时,程序的流程立即返回到调用该函数的地方(通常称为退出调用函数),并通过return语句返回函数值。return语句中表达式的值就是函数返回值。注意:如果函数有返回值,这个值就应该有一个确定的数据类型,所以在定义函数首部时应指定函数值的类型。函数返回值说明:在同一个函数内可根据需要在多处设置return语句,函数执行过程中遇到任何一个return语句时,都将立即返回到调用该函数的地方。如果函数中没有return语句,程序的流程一直执行到函数末尾的右花括号“}”处,然后返回到调用该函数的地方。为了明确表示“不返回值”,可以用“void”定义“无类型”(或称“空类型”)函数。如果需要从被调函数中带回一个确定的值,被调函数中必须包含return
语句。函数调用格式函数调用的一般形式:函数名([实参表])
实参表:可以是常量、变量或表达式。其类型、顺序和个数必须与函数定义时形参表的一致。对于无参函数,则省略实参,但括号不能省略。函数调用表达式可出现在主调函数的任何地方。函数调用过程图解函数举例例:试编写一个C程序按下列公式求排列组合问题Cmn=m!/(n!*(m-n)!)main(){intm,n;longcmn;printf("inputm,n:");scanf("%d%d",&m,&n);
cmn=fac(m)/fac(n)/fac(m-n);printf("%ld\n",amn);}longfac(intn){inti;longk=1;for(i=1;i<=n;i++)k*=i;return(k);}函数的声明在一个函数中调用另一函数(即被调函数)必须具备以下三个条件:被调函数必须是已经存在的函数(标准函数或用户自定义函数)。如果调用的是标准函数,应该用预处理命令
#include
将该函数对应的头文件包含进来。如果调用用户自定义函数,可能需要对被调用函数返回值的类型以及形参的个数和类型作声明。函数声明函数声明的一般形式:类型标识符被调函数的函数名([形式参数表]);这种包含参数和返回值类型的函数声明称为函数原型。注意:主调函数中的函数声明只是声明了要调用的函数返回值的类型以及形参的个数和类型,不是定义一个函数。函数声明时指定的函数返回值类型必须与该函数定义时所指定的类型一致。在同一个文件中,如果被调函数位于主调函数之前,或者被调函数的返回值是int型或char型时,则对被调函数的声明可以省略。函数举例例:
#include“stdio.h”main(){inta,b,c;
int
max(intx,inty);/*函数说明*/ scanf(“%d%d”,&a,&b);
c=max(a,b);/*函数调用*/ printf(“%d\n”,c);}intmax(intx,inty)/*函数定义*/ {return(x>y?x:y);}函数参数形参:形参出现在函数的定义中,在整个函数体内可以使用,离开该函数则不能使用;形参必须是变量,在函数定义时必须进行类型说明;函数调用时,形参被临时分配存储单元,调用结束后,形参所占单元被释放。实参:实参出现在主调函数中,在函数调用时,把实参的值传递给形参,从而实现主调函数向被调函数的数据传递。实参可以是常量和有确定值的变量、数组元素或表达式。注意:在函数调用期间,实参和形参对应不同的内存单元,所以在被调函数中形参的改变不会影响到主调函数的实参,这是一种“单向传值”调用。参数举例#include“stdio.h”intab(intd){if(d<0)d=-d;return(d); }main(){inta,b;scanf(“%d”,&b);a=ab(b);printf(“%d%d”,b,a);}输入-5结果–55关于单向传值注意事项在被定义的函数中,必须指定形参的类型。实参与形参应在位置、个数、类型上保持一致。如果实参为整型而形参为实型,或者相反,则发生“类型不匹配”的错误。但字符型与整型可以互相通用。C语言规定,实参变量对形参变量的数据传递是“单向值传递”。即数据只能由实参传给形参,而不能由形参传回给实参。关于单向传值调用归纳如下:函数的嵌套调用C语言函数的定义是平行的、独立的,不能嵌套定义,但可以嵌套调用。也就是说,在调用一个函数的过程中,被调函数又可以调用另一个函数。例:求longfac(intn){inti;longk=1;for(i=1;i<=n;i++)k*=i;returnk;}longcmn(intm,intn){floatc;c=fac(m)/fac(n)/fac(m-n);returnc;}main(){printf(“c(9,3)=%ld\n",cmn(9,3));}longfac(intn);longcmn(intmintn);
函数的递归调用一个函数直接或间接地调用该函数本身,称为函数的递归调用。一个问题要采用递归方法来解决时,必须满足以下三个条件:可以把要解决的问题转化为一个新的问题,而这个新的问题的解法仍与原来的解法相同,只是所处理的对象有规律地递增或递减。可以应用这个转化过程使问题得到解决。必定要有一个明确的结束递归的条件。递归举例longfac(intn){longf;if(n==0||n==1)f=1;elsef=n*fac(n-1);
return(f);
}main(){longnf;nf=fac(3);printf(“3!=%ld\n”,nf);} 1n=0,1n!= n*(n-1)!n>1例:利用递归计算n! 1n=0,1fac(n)= n*fac(n-1)n>1变量的存储类别C语言中的每个变量和函数都有两个属性:数据类型和数据的存储类别。数据的存储类别指的是数据在内存中的存储方法。分为:静态存储类和动态存储类。变量的存储类别决定了变量的作用域和生存期。变量的数据类型决定了变量的取值范围。程序区静态存储区动态存储区作用域:变量能够起作用的程序范围。分局部变量和全局变量。生存期:变量占用内存单元的时限。有的变量可能在整个程序运行期间一直存在(占用内存空间),此变量称为静态变量;也有的变量可能只在某个函数的执行期间才存在,这种变量称为是动态变量。与存储类别有关的说明符有四个,即:auto,static,register,extern局部变量及其存储类别在函数内(或复合语句中)定义的变量称为局部变量。函数的形参属于局部变量。局部变量的作用域:本函数(或复合语句)内。
如:main(){inta,b;/*局部变量a,b在main中有效*/······
{intb,c;/*局部变量b,c在复合语句中有效*/······}······}floatf1(inta){intb,c; ……}变量的存储类别局部变量的存储类别有三种:
auto,static和register。
(1)auto变量在函数体中定义的局部变量如果使用“auto”关键字或缺省该关键字,这种局部变量叫“自动变量”。
如:autointa,b;或inta,b;
自动变量的生存期:函数被调用期间自动变量的值:存放在动态存储区中自动局部变量举例
main(){intk;intf(intb);for(k=1;k<=4;k++)f(k);}intf(intb){inta=10;printf(“a=%d,b=%d\n”,a,b);a+=10;}运行结果:a=10,b=1a=10,b=2a=10,b=3a=10,b=4在同一函数的两次调用之间,自动局部变量的值不保留。静态局部变量在函数体中定义的局部变量如果使用“static”关键字,称为“静态局部变量”。
如:staticinta=10;
静态局部变量的生存期:整个程序运行期间静态局部变量的值:存放在静态存储区中
注意:在整个程序的运行期间,静态局部变量占据的存储单元一直保留而不释放,直到程序运行结束。两次函数调用期间变量的值保持连续。静态局部变量举例main(){intk;intf(intb);for(k=1;k<=4;k++)f(k);}intf(intb){staticinta=10;printf(“a=%d,b=%d\n”,a,b);a+=10;}运行结果:a=10,b=1a=20,b=2a=30,b=3a=40,b=4说明:(1)静态局部变量在编译时赋初值,程序运行时,每次调用函数,该变量保留上一次的值,而非初值。自动变量在执行时赋初值。(2)若定义时不赋初值,则局部静态变量为0,自动变量值不定。(3)函数调用结束后,虽然静态局部变量有值,但其他函数不能使用它。register变量在函数体中定义的局部变量如果使用“register”字样存储类别关键字,这种局部变量叫“寄存器变量”。
如:registerinta,b;或inta,b;
寄存器变量的生存期:函数被调用期间寄存器变量的值:存放在CPU的寄存器中注意:
CPU中寄存器的数目是有限的,因此只能说明少量的寄存器变量。由于register
变量的值是放在寄存器内而不是放在内存中,所以
register
变量没有地址,也就不能对他进行求地址运算。register变量的说明应尽量靠近其使用的地方,用完之后尽快释放,以便提高寄存器的利用效率。全局变量及其存储类别全局变量:在函数外部定义的变量称为全局变量。全局变量的作用域:从定义变量的位置开始到整个源文件结束止。注意:在一个函数内部,既可以使用本函数定义的局部变量,也可以使用有效的全局变量(在此函数之前定义的全局变量)。在同一个文件中,若全局变量与局部变量同名,则在局部变量的作用域内,全局变量不起作用。全局变量举例
intk=10;main(){intm,j=k;intk=20;m=k;printf(“%d,%d,%d\n”,k,j,m);}结果:20,10,20全局变量的存储类别全局变量的存储类别有两种:
外部的(extern)和静态的(static)
(1)外部全局变量在定义全局变量时缺省其存储类别,则称为“外部变量”。外部变量的生存期:整个程序的运行期间
外部变量的值:存放在静态存储区全局变量举例floatsum=0,mul=0,sub=0;/*定义全局变量*/floatCompute(floatx,floaty){sum=x+y;
sub=x-y;
mul=x*y;
return(x/y);}main(){floatx,y,z;
scanf("%f,%f",&x,&y);
z=Compute(x,y);
printf("%f,%f,%f,%f\n",sum,sub,mul,z);}
例:已知两个实数,编写一函数求其和、差、积、商。外部全局变量floatf1(){externinta;……}floatf2(){……}intafloatf3(){……}/*文件1*/intx;main(){……}/*文件3*/externintx;f2(){……}/*文件2*/
externintx;f1(){……}注意:如果在外部变量的定义点之前需使用全局变量,应在该函数中进行外部变量的说明,格式为:
extern外部变量名表用extern对全局变量加以声明,就可将其作用域扩充到整个源文件或其它源文件中。静态全局变量在定义全局变量时加“static”关键字,称为“静态全局变量”。
静态全局变量的作用域:仅限于定义它的源文件中静态全局变量的生存期:整个程序的运行期间/*文件1*/static
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024农产品订购合同
- 2024年广西古建施工承揽合同模板
- 2024年人力资源服务保密协议
- 2024年度城市轨道交通安全监控系统合同
- 2024年建筑内架搭建专业承包合同
- 2024年度产品研发与技术服务合同
- 2024不能强迫续订劳动合同
- 2024年度赠与合同
- 2024年废旧物品回收处理协议
- 2024商铺租赁合同适用于各类商业街、购物中心店铺
- 文明礼仪主题班会课件(共23张)
- 航站楼管理部《机场使用手册》实施细则
- 脑卒中基本知识课件
- 高效沟通与管理技能提升课件
- 消防维保方案 (详细完整版)
- 四年级上册英语课件- M3U1 In the school (Period 3 ) 上海牛津版试用版(共15张PPT)
- 档案馆建设标准
- 高边坡支护专家论证方案(附有大量的图件)
- 苏教版五年级上册数学试题-第一、二单元 测试卷【含答案】
- 人员定位矿用井口唯一性检测系统
- 电力系统数据标记语言E语言格式规范CIME
评论
0/150
提交评论