《《C语言程序设计》第6章函数.ppt》由会员分享,可在线阅读,更多相关《《C语言程序设计》第6章函数.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6章章 函数函数结结构化程序的模构化程序的模块结块结构构:主控模主控模块块模模块块1.1模模块块1.n 模模块块2.1模模块块2.n模模块块n.1模模块块n.n模模块块1模模块块2模模块块n第第6章章 函数函数程序程序结结构构:main()f1();f2();fn();f1()f11();f12();f11()f2()f21();f22();fn()fn1();fn2()f12()f21()f22()fn1()fn2()第第6章章 函数函数根据函数的定根据函数的定义义者不同者不同,分,分为为如下两大如下两大类类:(1)标标准函数:准函数:系系统统提供的已定提供的已定义义的函数,一般用的函数
2、,一般用户户都可以都可以调调用。如前面学用。如前面学习过习过的的输输入入输输出函数出函数scanf、printf、getchar、putchar等。等。Turbo C 2.0的部分常用的部分常用库库函数函数见见附附录录D。(2)用)用户户自定自定义义函数:函数:用用户户自己自己编编写的用来解决具体写的用来解决具体问题问题的函数。的函数。第第6章章 函数函数根据函数的参数形式根据函数的参数形式,C语语言函数又分言函数又分为为如下两种:如下两种:(1)无参函数:)无参函数:主主调调函数并不将数据函数并不将数据传传送送给给被被调调用函数。用函数。(2)有参函数:)有参函数:在在调调用函数用函数时时,
3、在主,在主调调函数和被函数和被调调函数之函数之间间有参数有参数传递传递,也就是,也就是说说,主,主调调函数可以将数据函数可以将数据传传送送给给被被调调用函数使用,被用函数使用,被调调用函数中的数据也可以用函数中的数据也可以带带回来供主回来供主调调函数函数使用。使用。第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.1 函数定函数定义义函数定函数定义义的的一般形式:一般形式:类类型型标识标识符符 函数名函数名(形式参数表列形式参数表列)说说明部分明部分 执执行部分行部分 例:例:int max(int x,int y)/*函数首部函数首部*/*函数体开始函数体开始*/int z
4、;/*说明部分说明部分*/if(xy)z=x;/*执行部分执行部分*/else z=y;return(z);/*函数体结束函数体结束*/第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.1 函数定函数定义义说说明:明:函数定函数定义义包括函数首部和函数体两部分。包括函数首部和函数体两部分。(1)函数首部:)函数首部:函数定函数定义义的第一行。的第一行。1)函数名前面的函数名前面的类类型型标识标识符符是指函数返回是指函数返回值值的的类类型,型,简简称称函数函数值类值类型。型。函数的返回函数的返回值值由函数中的由函数中的return语语句句获获得,即得,即return后的表达式的
5、后的表达式的值值,可以是,可以是简单类简单类型、型、void类类型或构造型或构造类类型等。当型等。当return后的表达式的后的表达式的类类型与函数名前面的型与函数名前面的类类型型标标识识符不一致符不一致时时,以函数名前面的,以函数名前面的类类型型标识标识符符为为函数函数值类值类型型(即是将(即是将return后的表达式的后的表达式的值转换为值转换为函数名前面的函数名前面的类类型后型后作作为为函数函数值值返回)。如果函数中无返回)。如果函数中无return语语句,将返回一个句,将返回一个不确定不确定值值;如希望不返回;如希望不返回值值,可以定,可以定义义函数函数类类型型为为void,当,当函数
6、函数值类值类型型为为int时时,可省略其,可省略其类类型的型的说说明。明。第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.1 函数定函数定义义说说明:明:函数定函数定义义包括函数首部和函数体两部分。包括函数首部和函数体两部分。(1)函数首部:)函数首部:函数定函数定义义的第一行。的第一行。2)函数名函数名是函数的是函数的标识标识符,遵循符,遵循C语语言言标识标识符的命名符的命名规则规则,区,区分大小写。分大小写。3)函数名后的形式参数表函数名后的形式参数表列列给给出函数的形式参数及其出函数的形式参数及其类类型型说说明。形式参数明。形式参数简简称形参,形式参数及其称形参,形式
7、参数及其类类型型说说明放在函数名后明放在函数名后的一的一对圆对圆括号中,要特括号中,要特别别注意的是,无注意的是,无论论函数是否有形式参数,函数是否有形式参数,函数名后的函数名后的圆圆括号不可省,并且括号不可省,并且圆圆括号之后不能接括号之后不能接“;”。形式参形式参数表列的一般形式如下:数表列的一般形式如下:形参形参1类类型型 形参形参1,形参,形参2类类型型 形参形参2,形参,形参n类类型型 形参形参n第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.1 函数定函数定义义说说明:明:函数定函数定义义包括函数首部和函数体两部分。包括函数首部和函数体两部分。(1)函数首部:)
8、函数首部:函数定函数定义义的第一行。的第一行。(2)函数体:)函数体:函数函数说说明之后的花括号明之后的花括号“”括起来的部分,包括起来的部分,包括括说说明部分和明部分和执执行部分。行部分。1)声明部分:用来)声明部分:用来对对函数中使用的函数中使用的变变量和函数作量和函数作说说明。明。2)执执行部分:行部分:由基本由基本语语句句组组成,函数的功能由函数体内的成,函数的功能由函数体内的各个各个语语句的句的执执行来行来实现实现。第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.2 函数函数调调用用一个函数一旦被定一个函数一旦被定义义,就可以在程序的其他函数中使用它,就可以在程序
9、的其他函数中使用它,这这个个过过程称程称为为函数函数调调用。用。1函数函数调调用的一般形式用的一般形式 函数名函数名(实实参表列参表列);2函数函数调调用用语语句的句的执执行行过过程程 首先首先计计算每个算每个实实参表达式的参表达式的值值,并把此,并把此值值存入所存入所对应对应的的形参形参单单元中,然后把元中,然后把执执行流程行流程转转入函数体中,入函数体中,执执行函数体中行函数体中的的语语句,当句,当执执行到函数体的右花括号或行到函数体的右花括号或return语语句句时时,表示,表示函数体函数体执执行完成,行完成,这时这时将返回到将返回到调调用此函数的用此函数的语语句的下一条句的下一条语语句
10、,句,继续继续往下往下执执行。行。第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.2 函数函数调调用用例:例:#includeint max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(max=%d,c);程序结果如下:程序结果如下:输入:输入:10 20输出:输出:20一个函数一旦被定一个函数一旦被定义义,就可以在程序的其他函数中使用它,就可以在程序的其他函数中使用它,这这个个过过程称程称为为函数函数调调用。用。第第6章章 函数函数6.1
11、函数的定函数的定义义和和调调用用6.1.2 函数函数调调用用一个函数一旦被定一个函数一旦被定义义,就可以在程序的其他函数中使用它,就可以在程序的其他函数中使用它,这这个个过过程称程称为为函数函数调调用。用。3说说明明(1)在定)在定义义函数中指定的形参函数中指定的形参变变量,在未出量,在未出现现函数函数调调用用时时,它,它们们并不并不占内存中的存占内存中的存储单储单元;只有元;只有发发生函数生函数调调用用时时被被调调用函数中的形参才被分用函数中的形参才被分配内存配内存单单元。元。调调用用结结束后,形参所占用的内存束后,形参所占用的内存单单元也同元也同时时被被释释放。放。(2)实实参可以是常量、
12、参可以是常量、变变量或表达式,但必量或表达式,但必须须有确定的有确定的值值。在。在调调用用时时将将实实参的参的值赋给值赋给形参形参变变量。量。(3)实实参与形参的参与形参的类类型型应应一致。只有字符型和整型可以互相通用。一致。只有字符型和整型可以互相通用。(4)实实参参变变量量对对形参形参变变量的数据量的数据传递传递是是“值传递值传递”,即,即单单向向传递传递,只由,只由实实参参传给传给形参,而不能由形参形参,而不能由形参传传回来回来给实给实参。在内存中,参。在内存中,实实参参变变量与形量与形参参变变量是不同的量是不同的单单元,即使同名,也是不同的元,即使同名,也是不同的单单元。形参的元。形参
13、的值值如果如果发发生生改改变变,并不会改,并不会改变变主主调调函数的函数的实实参参值值。第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.2 函数函数调调用用例:例:一个函数一旦被定一个函数一旦被定义义,就可以在程序的其他函数中使用它,就可以在程序的其他函数中使用它,这这个个过过程称程称为为函数函数调调用。用。#includeswap(int x,int y)int t;printf(2)a=%d b=%dn,x,y);t=x;x=y;y=t;printf(3)a=%d b=%dn,x,y);main()int x=10,y=20;printf(1)x=%d y=%dn,x,
14、y);swap(x,y);printf(4)x=%d y=%dn,x,y);程序结果如下:程序结果如下:(1)x=10 y=20(2)x=10 y=20(3)x=20 y=10(4)x=10 y=20第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.2 函数函数调调用用一个函数一旦被定一个函数一旦被定义义,就可以在程序的其他函数中使用它,就可以在程序的其他函数中使用它,这这个个过过程称程称为为函数函数调调用。用。4函数函数调调用方式用方式函数有以下三种函数有以下三种调调用方式:用方式:(1)函数)函数语语句:句:把函数把函数调调用作用作为为一个一个语语句,句,例如:例如:so
15、rt();这时这时不要求函数不要求函数带带回回值值,只要求函数完成一定的操作。,只要求函数完成一定的操作。(2)函数表达式:)函数表达式:函数出函数出现现在一表达式中,在一表达式中,这这种表达式称种表达式称为为函数表达函数表达式。式。这时这时要求函数要求函数带带回一个确定的回一个确定的值值以参加表达式的以参加表达式的计计算。算。例如:例如:c=2*max(a,b);(3)函数参数。)函数参数。函数函数调调用作用作为为一个函数的一个函数的实实参。参。例如:例如:m=max(a,max(b,c);其中其中max(b,c)是一次函数是一次函数调调用,它的用,它的值值作作为为max另一次另一次调调用的
16、用的实实参。参。第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.3 函数声明函数声明 调调用用用用户户自定自定义义函数函数时时,一般,一般调调用函数和被用函数和被调调用函数用函数应应在同一在同一个文件中,在个文件中,在调调用函数中用函数中对对被被调调用函数返回用函数返回值值的的类类型、函数名称、型、函数名称、函数形式参数的函数形式参数的类类型型进进行行说说明,明,这这种种说说明称明称为为函数声明。函数声明。例:例:#includemain()int a,b,c;int max(int,int);/*对对max函数函数进进行声明行声明*/scanf(%d%d,&a,&b);c
17、=max(a,b);printf(max=%d,c);int max(int x,int y)int z;z=xy?x:y;return(z);第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.3 函数声明函数声明函数声明有以下三种形式:函数声明有以下三种形式:(1)类类型名型名 函数名函数名(类类型型1 形参形参1,类类型型2 形参形参2,类类型型n 形参形参n);(2)类类型名型名 函数名函数名(类类型型1,类类型型2,类类型型n);(3)类类型名型名 函数名函数名();其中,形式(其中,形式(2)是最常用的一种声明形式。)是最常用的一种声明形式。第第6章章 函数函数6.
18、1 函数的定函数的定义义和和调调用用6.1.3 函数声明函数声明对对被被调调用函数的声明,在以下几种情况下可以省略:用函数的声明,在以下几种情况下可以省略:(1)如果函数)如果函数值值是整型或字符型,可以不是整型或字符型,可以不进进行声明。行声明。例:例:#includemain()int a,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(max=%d,c);int max(int x,int y)int z;z=xy?x:y;return(z);第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.3 函数声明函数声明对对被被调调用函数的声明,
19、在以下几种情况下可以省略:用函数的声明,在以下几种情况下可以省略:(2)如果被)如果被调调用函数的定用函数的定义义出出现现在主在主调调函数之前,可以不声明。函数之前,可以不声明。例:例:int max(int x,int y)int z;z=xy?x:y;return(z);#includemain()int a,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(max=%d,c);第第6章章 函数函数6.1 函数的定函数的定义义和和调调用用6.1.3 函数声明函数声明对对被被调调用函数的声明,在以下几种情况下可以省略:用函数的声明,在以下几种情况下可以省略:(3
20、)如果在所有函数定)如果在所有函数定义义之前之前对对函数函数类类型型进进行了声明,行了声明,则则在在各个主各个主调调函数中不再函数中不再进进行声明。行声明。例:例:int max(int,int);#includemain()int a,b,c;scanf(%d%d,&a,&b);c=max(a,b);printf(max=%d,c);int max(int x,int y)int z;z=xy?x:y;return(z);第第6章章 函数函数6.2 函数的嵌套函数的嵌套调调用和用和递归调递归调用用6.2.1 函数的嵌套函数的嵌套调调用用 所所谓谓函数的嵌套函数的嵌套调调用是指一个函数用是指一
21、个函数调调用另一函数的用另一函数的过过程中程中又出又出现对现对其他函数的其他函数的调调用。用。函数嵌套函数嵌套调调用的用的调调用用结结构如构如图图所示:所示:main()f1();f1()f11();f11()第第6章章 函数函数6.2 函数的嵌套函数的嵌套调调用和用和递归调递归调用用6.2.1 函数的嵌套函数的嵌套调调用用例:例:fun1(int a,int b)int c;a+=a;b+=b;c=fun2(a,b);return c*c;fun2(int a,int b)int c;c=a*b%3;return c;main()int x=11,y=19;printf(%dn,fun1(x
22、,y);注意:注意:函数的函数的调调用可以用可以嵌套,但函数的定嵌套,但函数的定义义是是平行的、相互独立的,平行的、相互独立的,不能嵌套定不能嵌套定义义。第第6章章 函数函数6.2 函数的嵌套函数的嵌套调调用和用和递归调递归调用用6.2.2 函数的函数的递归调递归调用用 在在调调用一个函数的用一个函数的过过程中又出程中又出现现直接或直接或间间接地接地调调用用该该函数本函数本身,称身,称为为函数的函数的递归调递归调用。用。其其调调用用结结构如构如图图所示。所示。main()f1();f1()f11();f11()f1();第第6章章 函数函数6.2 函数的嵌套函数的嵌套调调用和用和递归调递归调用
23、用6.2.2 函数的函数的递归调递归调用用递归递归函数的函数的执执行包括行包括递递推和回推和回归归两个两个过过程。程。例:例:求求 t=n!1 (n=1)t=n*(n-1)!(n1)int f(int n)int t;if(n=1|n=0)t=1;else t=n*f(n-1);return t;main()int n,t;scanf(“%d”,&n);t=f(n);printf(%d!=%dn,n,t);递推:回归:main()=4*f(3)=3*f(2)=2*f(1)=1f(4)f(3)f(2)f(1)2(2!)6(3!)24(4!)第第6章章 函数函数6.3 变变量的作用域及存量的作用域
24、及存储类别储类别6.3.1 局部局部变变量与全局量与全局变变量量1局部局部变变量量 局部局部变变量是在一个函数内部量是在一个函数内部定定义义的的变变量,它只在本函数范量,它只在本函数范围围内有效。内有效。例:例:fun1(int a,int b)int c;a+=a;b+=b;c=fun2(a,b);printf(%d,%dn,a,b);return c;fun2(int a,int b)int x;a+=a;b+=b;int a=1;a=a+b;x=a+b;printf(%d,%d,%dn,a,b,x);return x;main()int x=11,y=19;printf(%dn,fun1
25、(x,y);printf(%d,%dn,x,y);程序运行结果如下:程序运行结果如下:44,76,12022,3812011,19第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.1 局部局部变变量与全局量与全局变变量量1局部局部变变量量说说明:明:(1)主函数)主函数main中定中定义义的的变变量也是局部量也是局部变变量,也只在主函数量,也只在主函数中有效。中有效。(2)形式参数也是局部)形式参数也是局部变变量,其他函数不能量,其他函数不能调调用。用。(3)可以在一个函数内部的复合)可以在一个函数内部的复合语语句中定句中定义变义变量,量,这这些些变变量量只在复合
26、只在复合语语句中有效。句中有效。(4)不同函数中可以使用相同名字的)不同函数中可以使用相同名字的变变量,它量,它们们代表不同的代表不同的对对象,互不干象,互不干扰扰。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.1 局部局部变变量与全局量与全局变变量量2全局全局变变量量全局全局变变量是在函数之外定量是在函数之外定义义的的变变量,从定量,从定义变义变量的位置量的位置开始到本源文件开始到本源文件结结束范束范围围内内有效。有效。例:例:int a,b;fun1()int c;a=2;b=3;c=fun2();printf(%d,%dn,a,b);return c;i
27、nt x=11,y;fun2()a+=a;b+=b;x=a+b;y=a-b;printf(%d,%d,%d,%dn,a,b,x,y);return x;main()int y=19;printf(%dn,fun1();printf(%d,%dn,x,y);程序运行结果如下:程序运行结果如下:4,6,10,-24,61010,19第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.1 局部局部变变量与全局量与全局变变量量2全局全局变变量量说说明:明:(1)全局)全局变变量可以在函数量可以在函数间传递间传递数据,增加函数数据,增加函数间间数据数据联联系的渠道。系的渠道。
28、(2)全局)全局变变量在程序的整个量在程序的整个执执行行过过程中都有效。程中都有效。(3)在同一个源文件中,全局)在同一个源文件中,全局变变量与局部量与局部变变量可以同名,量可以同名,在局部在局部变变量的作用范量的作用范围围内,全局内,全局变变量不起作用。量不起作用。(4)对对于全局于全局变变量,如果在定量,如果在定义时义时不不进进行初始化,行初始化,则则系系统统将自将自动赋动赋予其初予其初值值,对对数数值值型型变变量量赋赋0,对对字符型字符型赋变赋变量量0。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.2 动态变动态变量与静量与静态变态变量量1动态动态存存储
29、储方式和静方式和静态态存存储储方式方式(1)动态动态存存储储方式。是指在程序运行期方式。是指在程序运行期间间根据需要根据需要动态动态分分配存配存储储空空间间的方式。的方式。(2)静)静态态存存储储方式。是指在程序运行期方式。是指在程序运行期间间分配固定的存分配固定的存储储空空间间的方式。的方式。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.2 动态变动态变量与静量与静态变态变量量2动态变动态变量量 以以动动态态存存储储方方式式分分配配的的变变量量称称为为动动态态变变量量,包包括括所所有有函函数数的的形形式式参参数数、用用auto和和register声声明明的的
30、局局部部变变量量。动动态态变变量量一一般般定定义义在在函函数数内内部部(包包括括定定义义在在函函数数首首部部的的形形式式参参数数),只只有有当当程程序序进进入入该该函函数数时时才才分分配配存存储储空空间间,函函数数执执行行完完后后,变变量量的的存存储储空空间间被被释释放放,再再次次调调用用该该函函数数时时,系系统统重重新新分分配新的存配新的存储储空空间间。动态变动态变量在未被量在未被赋赋初初值时值时,其,其值为值为不能确定的随机不能确定的随机值值。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.2 动态变动态变量与静量与静态变态变量量2动态变动态变量量(1)用用
31、auto声声明明的的局局部部变变量量。用用auto声声明明的的局局部部变变量量又称又称动态动态的局部的局部变变量。量。其声明形式如下:其声明形式如下:auto 变变量量类类型型 变变量名量名;其中,其中,auto是可省略是可省略项项。例:例:int fun(int a)auto int b,c=3;int fun(int a)int b,c=3;以上定以上定义义的的b,c都是都是动态动态的局部的局部变变量。量。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.2 动态变动态变量与静量与静态变态变量量2动态变动态变量量(2)用用register声声明明的的局局部部变
32、变量量。用用register声声明明的的局局部部变变量量又又称称寄寄存存器器变变量量。寄寄存存器器变变量量的的值值放放在在CPU的的寄寄存存器器中中,使使用用时时直直接接从从寄寄存存器器取取出出参参加加运运算算,不不必必再再到到内内存存中中去去存存取取。为为了了提提高高执执行行效效率率,把把程程序序中中使使用用频频率率高高的的变变量量定定义义为为寄寄存存器器变变量。其声明形式如下:量。其声明形式如下:register 变变量量类类型型 变变量名量名;例:例:fun1()register int i;for(i=1;i=1000;i+)说说明:明:(1)只只有有局局部部动动态态变变量量和和形形式
33、式参数可以参数可以说说明明为为寄存器寄存器变变量。量。(2)一一个个计计算算机机系系统统中中的的寄寄存存器的数目是有限的。器的数目是有限的。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.2 动态变动态变量与静量与静态变态变量量3静静态变态变量量 以以静静态态存存储储方方式式分分配配的的变变量量称称为为静静态态变变量量,包包括括所所有有的的全全局局变变量量和和用用static声声明明的的局局部部变变量量。动动态态变变量量可可以以定定义义在在函函数数外外部部(如如:全全局局变变量量),也也可可以以定定义义在在函函数数内内部部(如如用用static声声明明的的局局部
34、部变变量量),静静态态变变量量在在程程序序执执行行过过程程中中占占有有固固定定的的存存储储空空间间,只在程序,只在程序执执行行结结束束时释时释放占用的存放占用的存储单储单元。元。静静态变态变量在未被量在未被赋赋初初值时值时,其,其值为值为0。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.2 动态变动态变量与静量与静态变态变量量3静静态变态变量量(1)用用static声声明明的的局局部部变变量量。用用static声声明明的的局局部部变变量量又又称称静静态态的局部的局部变变量。量。其声明形式如下:其声明形式如下:static 变变量量类类型型 变变量名量名;静静态
35、态局局部部变变量量的的作作用用域域仍仍然然是是变变量量定定义义所所在在的的函函数数,即即只只有有当当程程序序进进入入该该函函数数时时,这这些些变变量量才才可可以以使使用用,离离开开该该函函数数后后就就不不能能使使用用这这些些变变量量了了,但但不不能能使使用用并并不不代代表表这这些些变变量量不不存存在在,静静态态局局部部变变量量在在程程序序第第一一次次进进入入定定义义所所在在函函数数时时被被分分配配存存储储空空间间,函函数数执执行行完完(所所在在程程序序并并没没有有执执行行完完)后后,变变量量的的存存储储空空间间不不释释放放,再再次次调调用用该该函函数数时时,变变量量继继续续使使用用所所占的存占
36、的存储储空空间间,并保持上次,并保持上次调调用所得到的用所得到的结结果。果。第第6章章 函数函数6.3 变变量的作用域及存量的作用域及存储类别储类别6.3.2 动态变动态变量与静量与静态变态变量量3静静态变态变量量(1)用)用static声明的局部声明的局部变变量。量。例:例:int fun(int a)auto int b=0;static c=3;b+;c+;return(a+b+c);main()int a=2;int i;for(i=0;ib?a:b);正确答案:正确答案:double max(知(知识识点:函数的声明)点:函数的声明)试题试题分析:分析:当被当被调调用的函数定用的函数
37、定义处义处在函数在函数调调用后且不用后且不为为int类类型型时时,在函数,在函数调调用前必用前必须对须对被被调调用函数用函数进进行声明。行声明。对对函数函数进进行声明有下列三种形式:行声明有下列三种形式:(1)类类型名型名 函数名函数名(类类型型1 形参形参1,类类型型2 形参形参2,类类型型n 形参形参n);(2)类类型名型名 函数名函数名(类类型型1,类类型型2,类类型型n);(3)类类型名型名 函数名函数名();第第6章章 函数函数6.6 典型典型试题详试题详解解4以下程序的以下程序的输输出出结结果是果是_。t(int x,int y,int cp,int dp)cp=x*x+y*y;d
38、p=x*x-y*y;main()int a=4,b=3,c=5,d=6;t(a,b,c,d);printf(%d%d n,c,d);正确答案:正确答案:5 6(知(知识识点:函数的点:函数的调调用、参数用、参数传递传递)试题试题分析:分析:当当执执行行t(a,b,c,d);调调用函数用函数t时时,将,将实实参参a、b、c、d的的值传递给值传递给形参形参x、y、cp、dp,在函数,在函数t中中对对cp、dp进进行行计计算,改算,改变变了形参了形参cp、dp的的值值,但并没有改,但并没有改变对应实变对应实参参c、d的的值值(即形参的(即形参的值值不不带带回回给实给实参),因此参),因此返回后,返回
39、后,实实参参c、d的的值值不不变变。第第6章章 函数函数6.6 典型典型试题详试题详解解5有以下函数定有以下函数定义义:void fun(int n,double x)若以下若以下选项选项中的中的变变量都已量都已经经正确定正确定义义且且赋值赋值,则对则对函数函数fun的的正确正确调调用用语语句是句是_。A)fun(int y,double m);B)k=fun(10,12.5);C)fun(x,n);D)void fun(n,x);正确答案:正确答案:C(知(知识识点:函数的点:函数的调调用)用)试题试题分析:分析:当函数当函数类类型型为为void时时,函数不返回,函数不返回值值,函数,函数调
40、调用只用只能以函数能以函数语语句的形式出句的形式出现现,因此,因此,选项选项B显显然是不然是不对对的。在函的。在函数数调调用用时时,只,只须给须给出函数名和出函数名和实际实际参数,不能再参数,不能再给给出函数出函数类类型型和参数和参数类类型,所以型,所以选项选项A和和选项选项D都不都不对对。正确的。正确的选项选项是是C。第第6章章 函数函数6.6 典型典型试题详试题详解解6有以下程序:有以下程序:int f(int n)if(n=1)return 1;else return f(n-1)+1;main()int i,j=0;for(i=1;i1)主函数中主函数中j的的值值是是f(1)与与f(2
41、)之和,之和,显显然,然,f(1)=1,f(2)=2,因此,因此,j的的值为值为3。正确答案:正确答案:B(知(知识识点:函数的点:函数的递归调递归调用)用)试题试题分析:分析:在函数在函数f中有中有return f(n-1)+1,因,因此,此函数此,此函数调调用用为递归调为递归调用。用。递归递归函数函数f的的功能可用功能可用递归递归式表示如下:式表示如下:第第6章章 函数函数6.6 典型典型试题详试题详解解7以下程序运行后,以下程序运行后,输输出出结结果是果是_。int d=1;fun(int p)int d=5;d+=p+;printf(%d,d);A)84 B)99C)95 D)44正确
42、答案:正确答案:A(知(知识识点:全局点:全局变变量和局部量和局部变变量)量)试题试题分析:分析:函数函数main()中用到的是全局中用到的是全局变变量量d,而函数,而函数fun()中用到的是中用到的是其内部定其内部定义义的局部的局部变变量量d。在函数。在函数fun()中,表达式中,表达式p+的的值为值为3,执执行行d+=p+;后后d的的值为值为8(即(即5+3),函数),函数main()中表达式中表达式a+的的值为值为3,执执行行d+=a+;后后d的的值为值为4(即(即1+3)。)。main()int a=3;fun(a);d+=a+;printf(%dn,d);第第6章章 函数函数6.6
43、典型典型试题详试题详解解8以下程序的以下程序的输输出出结结果是果是_。main()int i,a=0;for(i=0;i5;i+)a+=f();printf(%dn,a);A)20 B)24 C)25D)15正确答案:正确答案:D(知(知识识点:点:动态变动态变量和静量和静态变态变量)量)试题试题分析:分析:在主函数在主函数main()中通中通过过循循环对环对函数函数f()调调用了用了5次,由于次,由于s动态动态局部局部变变量每次量每次进进入函数入函数f()后,后,s的初的初值值都是都是1,而,而i是静是静态态局部局部变变量,第一量,第一次次进进入函数入函数f()后,后,i的初的初值值都是都是
44、0,以后每次的初,以后每次的初值值是函数是函数f()上次上次调调用完成用完成后的后的i值值(即(即i是有是有记忆记忆的)。主函数的)。主函数main()中的中的a是将每次是将每次调调用后的函数用后的函数值值(即(即s的的值值)相加,其)相加,其值为值为15。int f()static int i=0;int s=1;s+=i;i+;return s;第第6章章 函数函数6.6 典型典型试题详试题详解解9在在C语语句中,形参的默句中,形参的默认认存存储类储类型是型是_。A)autoB)registerC)staticD)extern正确答案:正确答案:A(知(知识识点:点:动态变动态变量和静量和静态变态变量)量)试题试题分析:分析:在在C语语句中,形参的默句中,形参的默认认存存储类储类型是型是auto。第第6章章 函数函数6.6 典型典型试题详试题详解解10在在C语语句中,函数的句中,函数的隐隐含存含存储类储类型是型是_。A)autoB)staticC)externD)无存)无存储类别储类别正确答案:正确答案:C(知(知识识点:内部函数和外部函数)点:内部函数和外部函数)试题试题分析:分析:在在C语语句中,函数的句中,函数的隐隐含存含存储类储类型是型是extern,即,即外部函数。外部函数。