第5章函数_第1页
第5章函数_第2页
第5章函数_第3页
第5章函数_第4页
第5章函数_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、李坤陕西理工学院计算机科学与技术系Dept. of Comp. Sci. & Tech., SNUTFall, 2006l函数概述l函数定义的一般形式l函数的调用、参数和返回值l局部变量和全局变量l变量的存储类型l内部函数和外部函数lC语言用函数实现程序模块化l一个程序由一个或多个源程序文件组成l一个源程序文件由一个或多个函数组成lC程序的执行从main函数开始,并回到main函数结束l函数之间可以相互调用,或调用自身l不能调用main函数l函数之间相互独立,不存在从属关系l函数定义形式n返回类型 函数名(参数声明) 声明部分 语句l返回类型、参数、函数体内容都可没有ndummy()/

2、* does nothing & returns nothing */l关于“返回类型”n指函数返回值的类型n若省略此项,则认为返回类型是intn若无返回值,则定义返回类型为voidl关于“参数声明”n类型 形参名, 类型 形参名, .l关于“声明部分”n指变量、函数的声明int max(int x, int y)int z;z = xy?x:y;return z;int min(int x, int y)return xy?x:y; nmax(a, 3); /*函数调用*/l值传递n实参对形参的数据传递是“值传递”l单向传递n只能把实参的值传递给形参n不能把形参的值传递给实参n对形参

3、的值所作的改变不能带回给实参l实参和形参是不同的变量n具有不同的存储空间n具有不同的生存期和作用域void swap(int x, int y)int t;t=x, x=y, y=t;void main()int a=1, b=4;swap(a, b);1a4b1x4y41l形式n形式一:return;n形式二:return expression;l功能n函数返回语句n结束函数调用n如果需要,还可以带回函数返回值l返回值的说明n函数返回值的类型在函数定义中指定n函数返回值通过函数中的return语句获得n若函数无返回值,则可以没有return语句nreturn语句后的表达式类型,应与函数返回值

4、类型相同,或可以兼容赋值;两者类型不同时,自动做类型转换n函数需要返回值时,若缺少return语句,或return语句未带返回值,则返回一个不确定值l一般形式n函数名(实参表列)l说明n即使没有实参,()也不能省略n多个实参之间用逗号分隔n实参与形参按顺序一一对应,类型应匹配n实参的求值顺序不确定,应避免对此敏感的调用形式printf(%d,%d, i, i+);l函数语句nprintf(%dn, i);l函数表达式n(c + d * max(a,b) % el函数参数ngcd(max(a,b), min(c, d)l说明n函数调用可以看作同返回类型的表达式使用n同时,函数调用还完成了函数中定

5、义的操作l一般形式n类型 函数名(类型1, 类型2, .);n类型 函数名(类型1 形参1, 类型2 形参2, .);l举例nint max(int, int);nint max(int x, int y);nvoid dummy(); /* 无参函数原型 */nvoid dummy(void); /* 同上 */l函数声明的形式即函数原型l在函数调用之前,应对函数进行声明l函数声明可以在主调函数的声明部分,也可以在函数外部l函数外部的声明,对所有主调函数都起作用,不需要在主调函数内再次声明l函数的定义也具有声明的作用l库函数的声明包括在头文件(*.h)里,不需在源程序里声明void main

6、()int max(int x, int y); /* 函数声明 */int a, b, c;c = max(a, b);int max(int x, int y)return xy?x:y;int max(int x, int y); /* 函数声明 */void main()/* 不需要再次声明int max(int, int) */int a, b, c; c = max(a, b);int max(int x, int y)return xy?x:y;int max(int x, int y)/* 函数定义具有声明作用 */return xy?x:y;void main()/* 不需要

7、再次声明int max(int, int) */int a, b, c;c = max(a, b);l调用一个函数的过程中,调用另一函数main函数函数结束结束调用调用a函数函数b函数函数a函数函数调用调用b函数函数l一个函数直接或间接的调用它自身l必须有一定的条件判断语句,使得递归调用能够终止f函数函数调用调用f函数函数f1函数函数调用调用f2函数函数f2函数函数调用调用f1函数函数l求阶乘l作用域n变量有效的代码空间n变量在作用域才能被引用n变量可以分为局部变量和全局变量l生存期n变量有效的运行时间n变量在生存期内才存在n变量可以分为静态存储和动态存储l局部变量n函数或复合语句内部定义的变

8、量l说明n作用域为本函数或复合语句范围n不同函数内的局部变量可以重名,它们是不同的变量,作用域不同,不会相互干扰n函数形参也是局部变量的一种n若多个同名局部变量作用域重叠,则最内层复合语句中定义的局部变量有效 float foo(int x) int a, i, j; /* 局部变量 */ . . /* 只能用在foo内部 */ void main() int a, b, c; /* 局部变量 */ . . /* 只能用在main内部 */ x,a,i,j作用域a,b,c作用域void main() int a, b, i; . . int c, i; c = a + b; i = a - b

9、; . . . .a,b,i作用域c,i作用域此范围内复合语句中定义的i有效l全局变量(外部变量)n函数之外定义的变量l说明n作用域从变量定义处到本源程序文件结束n全局变量可以被本文件的函数所共用n增加函数间传递数据的渠道n若全局变量与局部变量重名,则局部变量在作用域内屏蔽全局变量n应限制使用过多全局变量int a=10, b=5, x, y; /* 全局变量 */int max(int x, int y) return xy?x:y;int c; /* 全局变量 */void main() int a=8; c=max(a, b); /* 引用局部变量a */全局变量c作用域全局变量a,b,

10、x,y作用域形参x,y作用域局部变量a作用域l动态存储方式n程序运行期间根据需要动态分配存储空间n函数形参、自动变量等n每次调用函数时,给该函数中的局部变量和形参分配存储空间,函数返回后释放空间l静态存储方式n程序运行期间分配固定的存储空间n全局变量全部存放在静态存储区中l自动变量autol寄存器变量registerl静态变量staticl外部变量externlauto变量n局部变量,用auto关键字修饰nauto可以省略,是缺省的存储方式n自动分配和释放存储空间l举例int foo(int x) auto int a, b, c=6; /* 定义自动变量a,b,c */ float f, g

11、=0.1;/* 定义自动变量f,g */lregister变量n存放在CPU寄存器中,存取速度快n寄存器变量只能动态分配存储空间(寄存器)n只有自动变量和形参可以作为寄存器变量l举例int foo(int x) register int i;/* 定义寄存器变量i */ for(i=0; i10000; i+). /* i用于循环变量 */l静态局部变量n局部变量,用static关键字修饰n静态局部变量为静态存储,整个程序运行期间都不释放,其值不会丢失n在函数调用结束后,静态局部变量虽仍然存在,但已经不在变量的作用域内,所以其他函数不能引用它n静态局部变量在编译时赋初值,且只赋一次n若不对静态

12、局部变量赋初值,则初值为0int f(int a) int b=0; static int c=3; b+; c+; return a+b+c;void main() int x=2, i; for(i=0;iy?x:y;void main() extern A, B;/* extern声明外部变量 */ printf(%d, max(A, B); /* 在定义之前使用外部变量 */int A=13, B=-8; /* 定义外部变量 */* file1.c */* 声明外部变量 */extern A, B;void main() int c; c=max(A, B); printf(%d, c

13、);/* file2.c */* 定义外部变量 */int A=13, B=-8;int max(int x, int y) int z; z=xy?x:y; return z;l静态外部变量n限制外部变量只能被本文件引用n静态外部变量不能被其他文件引用l举例/* file1.c */static int A;main() . ./* file2.c */extern int A;void foo(int n) A = A * n;不能引用静态外部变量Al声明 (Declaration)n对变量的某些属性加以说明l定义 (Definition)n定义一个新的变量,并分配存储空间n定义有声明的功

14、能,但声明不一定都是定义l举例void main() extern A; /* 声明而非定义,声明A为已定义外部变量 */ . .int A; /* 定义A为整型外部变量 */l局部变量n自动变量(离开函数,值就消失)n寄存器变量(离开函数,值就消失)n形式参数(可为自动或寄存器变量)n静态局部变量(离开函数,值仍保留)l全局变量n静态外部变量(只限本文件引用)n非静态外部变量(允许其他文件引用)l动态存储n自动变量(本函数内有效)n寄存器变量(本函数内有效)n形式参数(本函数内有效)l静态存储n静态局部变量(本函数内有效)n静态外部变量(本文件内有效)n非静态外部变量(其他文件可以引用)l内

15、存动态存储区n自动变量n形式参数l内存静态存储区n静态局部变量n静态外部变量(本文件内有效)n非静态外部变量(其他文件可以引用)lCPU中的寄存器n寄存器变量变量存储类型函数内函数外作用域生存期作用域生存期自动变量 形式参数寄存器变量静态局部变量静态外部变量非静态外部变量只限本文件其他文件也可以引用l定义形式nstatic 类型 函数名(形参表)l说明n内部函数又称静态函数n内部函数只能在所在文件中使用n类似于静态外部变量的作用范围l举例nstatic int foo(int a, int b);l定义形式nextern 类型 函数名(形参表)l说明n可以在其他文件中调用nextern关键字在

16、定义时可以省略n需要调用该函数的文件中,用extern声明该函数是外部定义的l举例nextern int foo(int a, int b);l自动变量、形参、寄存器变量用法相同n寄存器变量存放在CPU中,但不影响用法l所有外部变量都是静态存储的n不管是不是static的外部变量lstatic关键字的意义n静态局部变量,表示“静态存储”n静态外部变量和函数,表示只能用于本文件n非静态外部变量和函数,表示其他文件可以引用,外部引用时用extern加以声明1. C语言可执行程序的开始执行点是语言可执行程序的开始执行点是 。A)程序中第一条可执行语句)程序中第一条可执行语句 B)程序中第一个函数)程

17、序中第一个函数C)程序中的)程序中的main函数函数D)包含文件中的第一个函数)包含文件中的第一个函数C2C语言的函数体中,下面语言的函数体中,下面 是正确的。是正确的。A)可以定义和调用其它函数;)可以定义和调用其它函数; B)可以调用但不能定义其它函数;)可以调用但不能定义其它函数;C)不可调用但可以定义其它函数;)不可调用但可以定义其它函数; D)不可调用及定义其它函数。)不可调用及定义其它函数。B3.以下叙述中正确的是以下叙述中正确的是 。A)C程序须由一个以上的函数组成程序须由一个以上的函数组成 B)C函数既可嵌套定义又可递归调用函数既可嵌套定义又可递归调用C)函数须有返回值)函数须

18、有返回值,否则不能调用否则不能调用 D)有调用关系的函数须在一个文件中)有调用关系的函数须在一个文件中A4函数返回值的类型应由函数返回值的类型应由 决定。决定。A)return中的表达式类型中的表达式类型 B)调用该函数的主调函数类型)调用该函数的主调函数类型C)定义函数所指定的类型)定义函数所指定的类型 D)实参类型)实参类型C5.以下叙述中不正确的是以下叙述中不正确的是 。A)一个函数中可以有多个)一个函数中可以有多个return语句语句 B)函数通过)函数通过return语句传回函数值语句传回函数值C)主函数可以有形参)主函数可以有形参 D)调用函数须独立语句完成)调用函数须独立语句完成

19、D6实参和形参之间的数据是实参和形参之间的数据是 传递。传递。A)地址)地址 B)值)值 C)互传)互传 D)用户指定)用户指定B7.以下叙述中不正确的是以下叙述中不正确的是 。 A)形参的值不能传给实参)形参的值不能传给实参 B)最好使用全局变量)最好使用全局变量 C)形参只局限于所在函数)形参只局限于所在函数 D)函数名的存储类别是外部存储类别)函数名的存储类别是外部存储类别B8数组名作为参数传递给函数,作为实在参数数组名作为参数传递给函数,作为实在参数的数组名被处理为的数组名被处理为 。A)该数组的长度;)该数组的长度; B)该数组的元素个数;)该数组的元素个数;C)该数组中各元素的值;

20、)该数组中各元素的值;D)该数组的首址。)该数组的首址。 D9.函数调用语句函数调用语句”f(e1,e2),(e3,e4,e5);”中参数的个数是中参数的个数是 。A)1 B)2 C)4 D)5B10退出循环而不终止函数的执行的有效方法退出循环而不终止函数的执行的有效方法是是 。A)break B)continue C)return D)exitA11.若对一个函数执行在先,说明在后,若对一个函数执行在先,说明在后,C语言将视其返语言将视其返回值为回值为 。A)非法;)非法; B)无返回值;)无返回值; C)浮点值;)浮点值; D)整型值。)整型值。D12C语言中函数的隐含存储类型是语言中函数

21、的隐含存储类型是 。A)auto B)static C)extern D)无存储类别)无存储类别C13.以下叙述中不正确的是以下叙述中不正确的是 。 A)在不同的函数中可以使用相同名字的变量)在不同的函数中可以使用相同名字的变量 B)函数中的形式参数是局部变量)函数中的形式参数是局部变量 C)在一个函数内定义的变量只在本函数范围内有效)在一个函数内定义的变量只在本函数范围内有效 D)在一个函数内的复合语句中定义的变量在本函数)在一个函数内的复合语句中定义的变量在本函数范围内有效范围内有效D14在整个源文件都有效的变量在在整个源文件都有效的变量在 定义定义.A)第一个函数中)第一个函数中 B)第

22、一个函数前)第一个函数前 C)主函数中)主函数中 D)函数中静态变量)函数中静态变量B15下面程序的运行结果为:下面程序的运行结果为: void fun(int a,int b,int c) a=456;b=567;c=678;main() int x=10,y=20,z=30; fun (x,y,z); printf(%d,%d,%dn,z,y,x);30,20,1016下面程序的运行结果为:下面程序的运行结果为: 。#include func(int x, int y) int z; z=x+y; return z;main() int a=6,b=7,c=8,r; r=func(a-,b

23、+,a+b), c-); printf(%dn,r);21 17.下面程序的运行结果为:下面程序的运行结果为: func1(int a,int b) int c; a+=a; b+=b; c=func2(a,b); return(c*c);func2(int a,int b) int c; c=a*b%3; return(c);main() int x=7,y=17; printf(%dn,func1(x,y);418.下面程序的运行结果为:下面程序的运行结果为: #include int fun(int x,int y) static int m=0,i=2; i+=m+1; m=i+x+y

24、; return m;main() int j=4,m=1,k; k=fun(j,m); printf(%d,k); k=fun(j,m); printf(%dn,k);8,1719.下面程序的运行结果为:下面程序的运行结果为: int i=1;main( )int i,j; i=reset( ); for(j=1;j=3;j+) printf(%dt%dt,i,j); printf(%dt,next(i); printf(%dt,last(i); printf(%dn,new(i+j); int reset( ) return(i);1 1 1 10 121 2 2 9 131 3 3 8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论