《最新C++_函数与编译预处理(共67张PPT课件).pptx》由会员分享,可在线阅读,更多相关《最新C++_函数与编译预处理(共67张PPT课件).pptx(67页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章章 函数函数(hnsh)与编译预处理与编译预处理掌握函数的概念、定义和调用方法。掌握函数的概念、定义和调用方法。理解递归的概念,并能运用递归的方法解决一些理解递归的概念,并能运用递归的方法解决一些(yxi)(yxi)实实际问题。际问题。理解变量的作用域与生存期的概念,能够理解全局变量、理解变量的作用域与生存期的概念,能够理解全局变量、局部变量、静态变量的概念和用法。局部变量、静态变量的概念和用法。 学习学习(xux)目标目标:第一页,共六十七页。4.1 概概 述述人们在求解一个复杂的问题的时候,通常采用人们在求解一个复杂的问题的时候,通常采用逐步分解、分而治逐步分解、分而治之之的方法。
2、也就是把一个大问题分解为几个比较容易求解的小问题,然的方法。也就是把一个大问题分解为几个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干个功能较为单一的程序模块,然后分别予以实现,最后再序划分为若干个功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块象搭积木一样搭起来,这种在程序设计中分而治之的把所有的程序模块象搭积木一样搭起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。策略,被称为模块化程序设计方法。函数:函数:用于完成某一特定任务用于完成某一特定任务
3、(rn wu)的一段程序。的一段程序。C/C+程序是由函数构成的,函数是程序是由函数构成的,函数是C/C+程序的基本模块。程序的基本模块。第二页,共六十七页。4.1 概概 述述一个程序一个程序(chngx)必须有且只有一个必须有且只有一个主函数主函数(main( )函数),函数),和若干个和若干个其它函数其它函数。 C/C+从从main( )函数开始执行,由主函数调用其它函数,调函数开始执行,由主函数调用其它函数,调用后流程还返回到用后流程还返回到main函数函数。其它函数之间也可以互相调用。其它函数之间也可以互相调用。 主函数主函数(hnsh)abcefg第三页,共六十七页。4.1 概概 述
4、述所有函数都是平等的。所有函数都是平等的。在定义函数时是分别进行在定义函数时是分别进行(jnxng)的,即的,即函数不能嵌套定义函数不能嵌套定义。函数间可以互相调用,但不能调用函数间可以互相调用,但不能调用main函数。函数。主函数主函数(hnsh)abcefg第四页,共六十七页。4.1 概概 述述1.库函数库函数 C/C+系统所提供的函数,提供了丰富的功能。多少随系系统所提供的函数,提供了丰富的功能。多少随系统而定,有一部分对所有的统而定,有一部分对所有的C/C+系统都有,格式也相同,称为系统都有,格式也相同,称为标准函数,标准函数,还有一部分与系统有关。使用说明还有一部分与系统有关。使用说
5、明: A)资料)资料 B)联机帮助)联机帮助2.用户自定义函数用户自定义函数 用户根据所需解决的问题用户根据所需解决的问题(wnt)而编写。而编写。函数定义函数定义是编写是编写的一段代码(并不执行),函数定义后就可使用它,称为的一段代码(并不执行),函数定义后就可使用它,称为函数函数调用。调用。第五页,共六十七页。4.1 概概 述述根据函数是否带有参数,将函数分为根据函数是否带有参数,将函数分为无参函数无参函数和和有参函数有参函数。通常,调用函数时要给出参数的函数,称。通常,调用函数时要给出参数的函数,称为有参函数;而调用函数时不需给出参数的函数称为为有参函数;而调用函数时不需给出参数的函数称
6、为无参函数。无参函数。根据函数的运算结果,函数又根据函数的运算结果,函数又有返回值有返回值和和无返回值无返回值之之分。分。使用函数的方式使用函数的方式(fngsh)是:是:先说明(定义),后使用先说明(定义),后使用(调用)(调用)。第六页,共六十七页。4.2 函数函数(hnsh)的定义与调用的定义与调用函数定义的一般形式:函数定义的一般形式:返回返回(fnhu)类型类型 函数名函数名(参数参数表表)语句序列语句序列return 返回值;返回值; 说明:说明:1.返回类型指函数返回的值的类型,也称返回类型指函数返回的值的类型,也称为为(chn wi):函数类型函数类型。2.返回类型如果是返回类
7、型如果是 void ,意为无值,意为无值返回。返回。3.返回类型说明若没有,指函数返回返回类型说明若没有,指函数返回整整型型数。也就是:数。也就是:若函数返回整型类若函数返回整型类型的数据,可省略函数返回类型说明,型的数据,可省略函数返回类型说明,否则不能省。否则不能省。4.若参数表空,称为无参函数,否则称若参数表空,称为无参函数,否则称为有参函数。为有参函数。5.无参函数参数表可写成(无参函数参数表可写成(void)或或写成()写成()。4.2.1 函数的定义函数的定义第七页,共六十七页。有参函数的几点说明:有参函数的几点说明:(1 1)定义函数时,函数的类型和函数体中)定义函数时,函数的类
8、型和函数体中returnreturn后的表达后的表达式值的类型应保持一致。如果两者不一致,则以函数式值的类型应保持一致。如果两者不一致,则以函数类型为准,系统会自动进行类型转换。类型为准,系统会自动进行类型转换。(2 2)在函数体中允许有多个)在函数体中允许有多个returnreturn语句,但每次调用只能语句,但每次调用只能有一个有一个return return 语句被执行,因此语句被执行,因此函数只能返回一个函数函数只能返回一个函数值值。(3 3)对于)对于不需要返回值不需要返回值的函数,在函数定义中应的函数,在函数定义中应规定函数返规定函数返回值类型为回值类型为voidvoid,但在函数
9、体的中间要结束,但在函数体的中间要结束(jish)(jish)函数的函数的执行,并返回调用处时,可使用不带表达式的执行,并返回调用处时,可使用不带表达式的returnreturn语句语句。此时。此时returnreturn语句的格式为:语句的格式为: return ;return ;第八页,共六十七页。4.2 函数函数(hnsh)的定义与调用的定义与调用* * * * * * * * * * * How do you do!* * * * * * * * * * *例:要求例:要求(yoqi)显示器输显示器输出:出:# #include #define NUM 11void main() in
10、t i; for(i=0; iNUM; i+) cout*; coutendl; cout“How do you do !”endl; for(i=0; iNUM; i+) cout*; coutendl;# #include #define NUM 11void print( ) int i; for (i=0; iNUM; i+) cout*; coutendl; void main() print(); cout“How do you do !”endl; print();在出现在出现(chxin)函数调用时,程函数调用时,程序控制转到函数,函数执行结序控制转到函数,函数执行结束后,回到
11、调用点(主函数),束后,回到调用点(主函数),继续执行后续语句。继续执行后续语句。函数调用函数调用函数定义函数定义第九页,共六十七页。函数调用的方式函数调用的方式(fngsh)作为作为(zuwi)语句语句 printstar( );作为作为(zuwi)表达式表达式 c=max (a,b); coutmax (a,b);作为作为函数参数函数参数 x=max(a,max(b,c); 1) 被调用的函数必须是已存在的函数被调用的函数必须是已存在的函数2) 如果使用库函数,必须包含相应文件。如果使用库函数,必须包含相应文件。如如 #include 说明:说明:4.2.2 函数的调用函数的调用第十页,共
12、六十七页。4.2.2 函数函数(hnsh)的调用的调用例例5-1 输入输入(shr)两个实数,求出其中的大数。设计一个函数两个实数,求出其中的大数。设计一个函数max求出两个实数中的大数。求出两个实数中的大数。#include float max(float x, float y) return ( xy ? x : y); void main(void) float a,b; cout ab; cout两个数中的大数为:两个数中的大数为:max(a,b)n; 当函数有返回值时,函数调用可出现当函数有返回值时,函数调用可出现在表达式中,也可作为一个函数调用语句在表达式中,也可作为一个函数调用语
13、句来实现来实现(shxin)。当函数调用出现在表达式。当函数调用出现在表达式中时,用执行函数体后返回的值参与表达中时,用执行函数体后返回的值参与表达式的运算。式的运算。 对于没有返回值的函数,函数调用对于没有返回值的函数,函数调用只能通过函数调用语句来实现。只能通过函数调用语句来实现。 在程序执行中要调用一个函数时,系在程序执行中要调用一个函数时,系统先要保护当前的现场,完成参数入栈等统先要保护当前的现场,完成参数入栈等工作;然后转去执行被调用函数的函数体。工作;然后转去执行被调用函数的函数体。 执行完被调用函数后,又要恢复现场,执行完被调用函数后,又要恢复现场,再接着执行函数调用后的其它语句
14、。再接着执行函数调用后的其它语句。 第十一页,共六十七页。4.2.2 函数函数(hnsh)的调用的调用#include int max (int a, int b) if (ab) return a; else return b;void main() int a,b,c, t; cina,b,c; t=max(a,b); t=max(t,c); couttendl; coutmax(a,b+10)endl;函数定义中的参数函数定义中的参数(cnsh)称为函数的形式参数称为函数的形式参数(cnsh),一般称为,一般称为形参形参。每个形参前应有形参的类。每个形参前应有形参的类型说明(不能写成型说
15、明(不能写成int a,b),形参之间用逗号隔开。,形参之间用逗号隔开。 函数调用中的参数函数调用中的参数称为函数的实际称为函数的实际参数,又称为参数,又称为实参实参。实参可以是。实参可以是表表达式达式,函数调用时,首先,函数调用时,首先计算表达计算表达式的值,再式的值,再转到函数,将值传递给转到函数,将值传递给对应的形参,然后开始执行函数体。对应的形参,然后开始执行函数体。return 的一般的一般格式为:格式为: return 执行该语句时,首先计算执行该语句时,首先计算(j sun)表达式的值,表达式的值,将该值转换成函数的返回值类型,再将其作为函将该值转换成函数的返回值类型,再将其作为
16、函数的返回值,结束函数,将控制转到调用函数的数的返回值,结束函数,将控制转到调用函数的地方继续执行。地方继续执行。 若函数无返回值,在函数体中也可使用若函数无返回值,在函数体中也可使用 return 语句结束函数的执行。语句结束函数的执行。 第十二页,共六十七页。4.2.2 函数函数(hnsh)的调用的调用调用函数时要考虑到函数本身的参数;调用函数时要考虑到函数本身的参数;调用调用标准库函数标准库函数时,要时,要包含相应的头文件包含相应的头文件标准输入标准输入/ /输出函数输出函数 iostream.hiostream.h字符串函数字符串函数 string.hstring.h常用数学函数常用数
17、学函数 math.hmath.h调用调用自定义函数自定义函数时,要定义相应的实参,并给这些实参赋值。时,要定义相应的实参,并给这些实参赋值。实参与形参必须一一对应实参与形参必须一一对应: :“类型一致类型一致(yzh)(yzh)、位置一致、位置一致(yzh)(yzh)、个数一致、个数一致(yzh)(yzh)”第十三页,共六十七页。函数调用的过程(guchng)第十四页,共六十七页。4.3 函数函数(hnsh)间的参数传递间的参数传递4.3.1 传值调用传值调用(dioyng)#include void change(int x, int y) int tmp; tmp=y; y=x; x=tm
18、p; coutx=xy=yendl;void main() int x=3,y=4; coutx=x y=yendl; change(x,y); coutx=x y =yendl;change:x:y:tmp:main:x: 3y: 434434 函数函数(hnsh)实参与形参实参与形参之间传递:之间传递:值传递值传递、引引用传递用传递、地址传递地址传递第十五页,共六十七页。void main(void) int i=2, x=5, j=7; void fun(int,int); fun ( j, 6);couti=i, j= j,x= xendl;void fun ( int i, int
19、j) int x=7; couti=i, j= j, x=xendl;2i5x7j676jxi7输出输出(shch): i=7, j=6, x=7 i=2, j=7, x=5 第十六页,共六十七页。4.3.1 传值调用传值调用(dioyng)1.计算实参表中各表达式;计算实参表中各表达式;2.将表达式的值依次赋给各形式参数;将表达式的值依次赋给各形式参数;3.执行函数体;执行函数体;4.遇到遇到return语句时,将控制返回到调用函数;语句时,将控制返回到调用函数;5.当当return语句中包含语句中包含(bohn)表达式时,计算表达式的值表达式时,计算表达式的值并返回函数值;并返回函数值;6
20、.无无return语句时,执行到函数体末后返回调用函数;语句时,执行到函数体末后返回调用函数;7.参数以传值方式调用。参数以传值方式调用。第十七页,共六十七页。void add ( int x, int y, int z) z=x+y; x=x*x; y=y*y; cout(2) x=x y=y z=zendl;void main( ) int x=2,y=3, z=0; cout(1) x=x y=y z=zendl; add (x, y, z); cout(3) x=x y=y z=zendl;2x3y0zxyz230495(1) x=2 y=3 z=0(2) x=4 y=9 z=5(3)
21、 x=2 y=3 z=0第十八页,共六十七页。4.3.2 引用引用(ynyng)调用调用 引用类型变量是其它变量的别名,对引用类型变量的操作引用类型变量是其它变量的别名,对引用类型变量的操作实际上就是对被引用变量的操作。实际上就是对被引用变量的操作。 说明一个引用类型变量时,必须要用另一个变量对其初始化。说说明一个引用类型变量时,必须要用另一个变量对其初始化。说明引用型变量的语法格式明引用型变量的语法格式(g shi)为:为: &=;其中,数据类型必须与变量名的类型相同,其中,数据类型必须与变量名的类型相同,&表明所说明的变量表明所说明的变量为引用类型变量。例如:为引用类型变量。例如:int
22、x;int &refx=x; 这里,这里,refx 是一个引用类型变量,它是整型变量是一个引用类型变量,它是整型变量 x的一个的一个别名,别名,refx 与与 x 使用同一内存空间。使用同一内存空间。refx 称为对称为对x 的引用,的引用,x 称称为为 refx 的引用对象。在说明引用类型变量的引用对象。在说明引用类型变量 refx 之前变量之前变量 x 必须先必须先说明。说明。第十九页,共六十七页。4.3.2 引用引用(ynyng)调用调用例:例: 引用引用(ynyng)的使用。的使用。#include void main(void) int x, y=36;int &refx=x, &r
23、efy=y;refx=12;coutx=x refx=refxendl;couty=y refy=refyendl;refx=y;coutx=x refx=refxendl;第二十页,共六十七页。4.3.2 引用引用(ynyng)调用调用注意注意(zh y):定义时必须初始化;定义时必须初始化;初始化值不能为常数;初始化值不能为常数; int &ref=5;系统不为引用类型变量分配存储空间。系统不为引用类型变量分配存储空间。同一变量可定义多个别名。同一变量可定义多个别名。引用类型变量亦可定义别名。引用类型变量亦可定义别名。第二十一页,共六十七页。4.3.2 引用引用(ynyng)调用调用1引用
24、作为函数的形参引用作为函数的形参 当函数的形参为引用类型时,函数的传值方当函数的形参为引用类型时,函数的传值方式式(fngsh)称为引用传递。既可作为函数的输入参数,称为引用传递。既可作为函数的输入参数,也可作为函数的输出参数。也可作为函数的输出参数。当在函数体内改变了引用类型的参数后,能实际地当在函数体内改变了引用类型的参数后,能实际地改变实参的值,将新的值带回给调用者。改变实参的值,将新的值带回给调用者。 问题:当函数的形参是引用类型时,实参是否可以是问题:当函数的形参是引用类型时,实参是否可以是表达式呢?表达式呢?第二十二页,共六十七页。#include void swap(int &p
25、, int &q) int t; t=p; p=q; q=t; void main() int a=3, b=4; couta bendl; swap(a, b); couta bendl;4.3.2 引用引用(ynyng)调用调用第二十三页,共六十七页。4.3.2 引用引用(ynyng)调用调用2引用作为引用作为(zuwi)函数的返回值函数的返回值 当函数的返回值定义为引用类型时,函数所返当函数的返回值定义为引用类型时,函数所返回的值应是某个变量的别名,相当于返回了一个变回的值应是某个变量的别名,相当于返回了一个变量,因此可对该返回值进行赋值操作。量,因此可对该返回值进行赋值操作。 注意:注
26、意:当函数的返回值类型为引用类型时,在函数当函数的返回值类型为引用类型时,在函数中只能返回静态变量或全局变量的引用,不能返回非静中只能返回静态变量或全局变量的引用,不能返回非静态的局部变量的引用,因为这种类型的变量在函数执行态的局部变量的引用,因为这种类型的变量在函数执行结束时,其存储空间被释放,因此对它的引用是无效的。结束时,其存储空间被释放,因此对它的引用是无效的。 第二十四页,共六十七页。例:将一个偶数分解例:将一个偶数分解(fnji)为两个素数之和为两个素数之和#include #include #include int p(int n) if (n=1) return 0;for (
27、int i=2; i=sqrt(n); i+)if (n%i=0) return 0; return 1;void main() int k;coutk;if (k%2) couterror!endl; exit(2); for (int i=2; i=k/2; i+) if (p(i)&p(k-i) couti+k-i=kendl;第二十五页,共六十七页。4.4 函数的原型函数的原型(yunxng)说明说明#include void main ( ) int a,b,t;cinab; print(a,b);t=max(a,b);couttendl;void print(int a, int
28、b) int i; for (i=0; imax(a,b); i+) cout*; couty)?x:y; void print (int,int);int max(int, int);int max (int,int);int max (int,int)void print (int,int);函数原型函数原型,函数若还没有,函数若还没有(mi yu)定义,就先使用,就需要给出函数原定义,就先使用,就需要给出函数原型,此时只要提供函数返回值类型,函数名,形参类型即可。型,此时只要提供函数返回值类型,函数名,形参类型即可。第二十六页,共六十七页。4.4 函数函数(hnsh)的原型说明的原型说明
29、函数原型说明的一般形式为:函数原型说明的一般形式为: 函数类型标识符函数类型标识符 函数名函数名( ( 形参类型说明表形参类型说明表 ) ;) ;说明:说明:(1 1)函数原型说明与函数定义的区别在于:)函数原型说明与函数定义的区别在于:函数函数原型说明没原型说明没有有(mi yu)(mi yu)函数体部分函数体部分,用分号结束,就像变量的声明。,用分号结束,就像变量的声明。(2 2)函数原型说明的位置可以在)函数原型说明的位置可以在主调函数体内主调函数体内,也可以在,也可以在主调主调函数外函数外,只要放在,只要放在对该函数的调用语句之前对该函数的调用语句之前,即使函数的定义放,即使函数的定义
30、放在其调用语句之后,也不会引起编译失败。在其调用语句之后,也不会引起编译失败。(3 3)函数原型说明时,)函数原型说明时,形参类型说明表中可以缺省形参变量形参类型说明表中可以缺省形参变量名名,只给出形参类型只给出形参类型。第二十七页,共六十七页。4.5 函数函数(hnsh)的递归调用的递归调用函数函数(hnsh)的递归调用:的递归调用:在调用一个函数的过程在调用一个函数的过程中中直接或间接地调用函数本身直接或间接地调用函数本身,称为函数的递归,称为函数的递归调用。调用。第二十八页,共六十七页。函数函数(hnsh)的递归调用的递归调用int f(int x ) int y,z ; . z=f(y
31、); . return (2*z);int f1(int x ) int y,z ; . z=f2(y); . return (2*z);int f2( int t) int a, c ; . c=f1(a); . return (3+c);第二十九页,共六十七页。4.5 函数函数(hnsh)的递归调用的递归调用n!=1 n=0,1(n-1)!*n n1unsigned long f(unsigned long n) if ( n =1|n=0 ) return 1; else return n*f(n-1); #include void main() unsigned long n; cin
32、n; coutf(n)1void main(void) int age(int); coutage(5)endl;int age ( int n ) int c; if (n=1) c=10; else c=age(n-1)+2; return c;第三十二页,共六十七页。int age ( int n ) int c; if (n= =1) c=10; else c=age(n-1)+2; return c;void main(void) int age(int); coutage(5)endl;age (5)n=5c=age (4)+2age (4)n=4c=age (3)+2age (3
33、)n=3c=age (2)+2age (2)n=2c=age (1)+2age (1)n=1c=10return creturn cc=12return cc=14return cc=16return cc=18 虽然算法一致,但虽然算法一致,但n n不同,不同,c c不同,在内存中每一层函数不同,在内存中每一层函数变量所在的内存单变量所在的内存单元均不相同元均不相同。必须必须(bx)(bx)有递归终止条件和递归公式有递归终止条件和递归公式。递归递归回推回推第三十三页,共六十七页。例例4.11 阅读下面程序,分析阅读下面程序,分析(fnx)程序运行的结果。程序运行的结果。void recu (
34、 char c ) coutc ; if(c3)recu (c+1) ; coutc ;void main( ) recu (0); 程序运行后的输出结果是:程序运行后的输出结果是: 01233210第三十四页,共六十七页。4.7 函数函数(hnsh)的重载的重载 函数的重载是指函数的重载是指完成不同功能的函数可以具有相完成不同功能的函数可以具有相同的函数名同的函数名。 (C语言无此功能)语言无此功能)调用重载函数时,调用重载函数时,C+编译器编译器根据实参的类型或实根据实参的类型或实参的个数来确定参的个数来确定(qudng)应该调用哪一个函数应该调用哪一个函数。注意:注意:重载函数的重载函数
35、的参数个数或参数类型必须有不同参数个数或参数类型必须有不同仅返回值类型不同时,不能定义为重载函数仅返回值类型不同时,不能定义为重载函数第三十五页,共六十七页。例:例: 利用重载函数,分别计算两个整数、单精度实数利用重载函数,分别计算两个整数、单精度实数(shsh)和双精度实数和双精度实数(shsh)中的大数。中的大数。#include int max(int x, int y) return ( xy?x:y ); float max(float a, float b) return ( ab?a:b ); double max(double m, double n) return ( mn?
36、m:n ); void main(void) int a1, a2; float b1, b2; double c1, c2; cout a1 a2; cout b1b2; cout c1c2; coutmax(a1,a2)= max(a1,a2) n; coutmax(b1,b2)= max(b1,b2) n; coutmax(c1,c2)= max(c1,c2) n; 重载重载(zhn zi)函数的函数的定义定义重载函数重载函数(hnsh)的的调用调用第三十六页,共六十七页。4.8 带有默认带有默认(mrn)(mrn)参数的函数参数的函数 在在C+中定义函数时,允许中定义函数时,允许(yn
37、x)给参数指定一个缺省的给参数指定一个缺省的值值。在调用函数时,若明确。在调用函数时,若明确给出了这种实参的值,则使给出了这种实参的值,则使用相应实参的值;若没有给用相应实参的值;若没有给出相应的实参,则使用缺省出相应的实参,则使用缺省的值(的值(C无此功能)。无此功能)。#include float fact(int n = 10)float f=1;for ( int i=2; i=n; i+) f *=i;return f;void main(void)cout fact(5) n; cout fact( ) n;第三十七页,共六十七页。4.8 带有默认参数带有默认参数(cnsh)(cn
38、sh)的函数的函数 注意:注意:必须在函数调用前指定缺省参数的值必须在函数调用前指定缺省参数的值参数的缺省值可以是参数的缺省值可以是常量常量(chngling)表达式表达式,表,表达式中使用的量达式中使用的量必须是常量必须是常量具有缺省值的函数参数可有多个,但具有缺省值的函数参数可有多个,但缺省参缺省参数必须位于参数表中的最右边数必须位于参数表中的最右边同一个具有缺省参数的函数,在不同地方调同一个具有缺省参数的函数,在不同地方调用时可使用不同的缺省参数值用时可使用不同的缺省参数值第三十八页,共六十七页。例:例: 输入长方体的长度,宽度输入长方体的长度,宽度(kund)和高度,求出长方体的体积。
39、和高度,求出长方体的体积。#include float v(float, float=10, float=20);void main(void)float x, y, z; coutxyz; cout第一个长方体的体积为:第一个长方体的体积为: v(x,y,z) n; coutxy; cout第二个长方体的体积为:第二个长方体的体积为: v(x,y) n; coutx; cout第三个长方体的体积为:第三个长方体的体积为: v(x) n; float v(float a, float b, float c)return a*b*c; 第三十九页,共六十七页。例:例: 对于同一个函数对于同一个函
40、数(hnsh),可在不同的作用域内作不同的原型说明,定义不同的缺,可在不同的作用域内作不同的原型说明,定义不同的缺省参数值。省参数值。float fact(int n =10); .void bb(void) float fact(int =20);. x=fact( ); .float cc (void) float fact(int =30);. y=fact( ); .float dd(void) . z=fact( ); .float fact(int n) float f=1; for (int i=2; i=n; i+) f *=i; return f;参数参数(cnsh)的缺省值
41、为的缺省值为20参数参数(cnsh)的缺省值为的缺省值为30参数的缺省值为参数的缺省值为10函数的定义函数的定义函数的原型说明函数的原型说明第四十页,共六十七页。4.9 局部变量和全局变量局部变量和全局变量 作用域作用域是指程序中所说明的标识符在哪一个区间内是指程序中所说明的标识符在哪一个区间内有效,即在哪一个区间内可以使用该标识符。有效,即在哪一个区间内可以使用该标识符。 C+中,作用域共分为中,作用域共分为(fn wi)五类:块作用域、文件五类:块作用域、文件作用域、函数原型作用域、函数作用域和类作用域。作用域、函数原型作用域、函数作用域和类作用域。 根据作用域不同,可分为根据作用域不同,
42、可分为局部变量局部变量和和全局变量全局变量。第四十一页,共六十七页。4.9.1 局部变量局部变量局部变量也称为内部变量,它是指在函数中定义局部变量也称为内部变量,它是指在函数中定义(dngy)(dngy)的变量,其作的变量,其作用域只在本函数范围内。用域只在本函数范围内。 在函数内定义的局部变量在函数内定义的局部变量, , 当退出函数时就不存在了。当退出函数时就不存在了。float f1( int a) int b,c; .float f2( int x, int y) int i, j; .void main(void ) int m, n; .x,y,i,j 有效有效a,b,c有效有效m,
43、n有效有效第四十二页,共六十七页。说明:说明:(1 1)主函数中定义的变量也只能在主函数中使用主函数中定义的变量也只能在主函数中使用,不能在其它函数,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。中使用。同时,主函数中也不能使用其它函数中定义的变量。(2 2)形参变量是属于被调函数的局部变量形参变量是属于被调函数的局部变量。(3 3)允许在不同的函数中使用相同的变量名允许在不同的函数中使用相同的变量名。不同函数中定义的同不同函数中定义的同名变量的作用域被限制于各自的函数体内名变量的作用域被限制于各自的函数体内,它们,它们(t men)(t men)代表不同的对象代表不同的
44、对象,系统为它们,系统为它们(t men)(t men)分配不同的存储单元,互不干扰,也不会发生混淆分配不同的存储单元,互不干扰,也不会发生混淆。(4 4)在)在复合语句中也可定义变量,也属于局部变量,其作用域只复合语句中也可定义变量,也属于局部变量,其作用域只在复合语句的范围内在复合语句的范围内。当复合语句中出现与其外部。当复合语句中出现与其外部同名同名变量时,在变量时,在复合语句内则由复合语句定义的变量起作用。复合语句内则由复合语句定义的变量起作用。4.9.1 局部变量局部变量第四十三页,共六十七页。例例4.15 分析下面程序分析下面程序(chngx)的输出。的输出。 #includevo
45、id main( ) int a=2 , b=3 ; coutfirst: atbn ; /A int a=5 ; b=a*3 ; coutsecond:atbn ; /B a+=b; /C coutthird:atbn ;程序程序(chngx)的输出是:的输出是: first: 2 3 second: 5 15 third: 17 15第四十四页,共六十七页。void ex1(float x, float y)int i=10, j=20;int a;a=30;j=a;couti jendl;第四十五页,共六十七页。4.9.2 4.9.2 全局变量全局变量 全局变量也称为外部变量,它是在函数
46、全局变量也称为外部变量,它是在函数(hnsh)(hnsh)外部定义的外部定义的变量,其作用域是整个源程序。变量,其作用域是整个源程序。p,q有效有效(yuxio)int p=1, q=5;float f1( int a) int b,c; .char c1,c2;main( ) int m, n; .a,b,c有效有效(yuxio)m,n有效有效c1,c2有效有效第四十六页,共六十七页。说明:说明:(1 1)全局变量增加了函数间数据联系的通道。因为同)全局变量增加了函数间数据联系的通道。因为同一文件中的所有函数都能引用全局变量,因此如果在一文件中的所有函数都能引用全局变量,因此如果在一个函数中
47、改变了全局变量的值,就能影响一个函数中改变了全局变量的值,就能影响(yngxing)(yngxing)到其它函数,相当于各个函数间有直接的传递通道。到其它函数,相当于各个函数间有直接的传递通道。所以,可以利用这一特点通过函数调用能得到一个以所以,可以利用这一特点通过函数调用能得到一个以上的值,而一般的函数调用只能由上的值,而一般的函数调用只能由returnreturn语句带回一语句带回一个返回值。个返回值。(2 2)全局变量可以为所有的函数所共用。)全局变量可以为所有的函数所共用。(3 3)若在同一源文件中全局变量与局部变量同名,则在局)若在同一源文件中全局变量与局部变量同名,则在局部变量的作
48、用范围内全局变量不起作用,即被部变量的作用范围内全局变量不起作用,即被“屏蔽屏蔽”。第四十七页,共六十七页。例例4.17 全局变量与局部变量同名全局变量与局部变量同名(tngmng)。 #includeint a=10 ; /全局变量全局变量aint f1( int a ) /形参形参areturn a*a ; int f2( int b ) int a; /局部变量局部变量a a=b+1; return a*a ; void main ( void ) coutThe result of f1 is: f1(2)n; coutThe result of f2 is: f2(2)n; cout
49、a=an; 该程序该程序(chngx)的运行结果为:的运行结果为:The result of f1 is: 4The result of f2 is: 9a=10第四十八页,共六十七页。如果如果(rgu)(rgu)在函数中要使用与其局部变量同在函数中要使用与其局部变量同名的全局变量,可以使用作用域运算符名的全局变量,可以使用作用域运算符“:”来限定全局变量。来限定全局变量。例例4.18 4.18 在局部变量作用域内引用同名的在局部变量作用域内引用同名的全局变量。全局变量。 #include double x=1.5 ; void main( void ) double x=5 ; cout全局
50、变量全局变量: :xn; /A cout局部变量局部变量: xn; 该程序的运行该程序的运行(ynxng)结果为:结果为:全局变量全局变量: 1.5局部变量局部变量: 5第四十九页,共六十七页。例:例:#include void swap(float x, float y ) float t; t=x; x=y; y=t; cout 函数函数(hnsh)swap:x=x y=y n;void main(void) float a=40, b=70; cout 主函数:主函数:a=a b=b n; swap(a,b); cout 主函数:主函数:a=a b=bn;#include float a