《第8章函数.ppt》由会员分享,可在线阅读,更多相关《第8章函数.ppt(103页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第8 8章章 函数函数8.1 8.1 概述概述一个一个一个一个C C程序,由一个主函数和若干其它函数组成,它们之间程序,由一个主函数和若干其它函数组成,它们之间程序,由一个主函数和若干其它函数组成,它们之间程序,由一个主函数和若干其它函数组成,它们之间的关系是:的关系是:的关系是:的关系是:主函数可以调用其它函数,其它函数可相互调用。主函数可以调用其它函数,其它函数可相互调用。主函数可以调用其它函数,其它函数可相互调用。主函数可以调用其它函数,其它函数可相互调用。函数:完成特定功能的程序段,通常由用户定义或系统定义函数:完成特定功能的程序段,通常由用户定义或系统定义函数:完成特定功能的程序段
2、,通常由用户定义或系统定义函数:完成特定功能的程序段,通常由用户定义或系统定义各函数可存放在一个文件中,也可以存放在不同的文件中。各函数可存放在一个文件中,也可以存放在不同的文件中。各函数可存放在一个文件中,也可以存放在不同的文件中。各函数可存放在一个文件中,也可以存放在不同的文件中。某程序整体结构,某程序整体结构,某程序整体结构,某程序整体结构,mainmaina ab bc cd de ef fg gh hh hi ie eg g程序运行轨迹:程序运行轨迹:程序运行轨迹:程序运行轨迹:mainmaina a d d a a e e a a main main b b f f e e f f
3、 b b g g b b h h b b main main c c h h g g h h c c i i c c mainmain 对于较大的程序来说,往往把其中相对独立的算法和功能对于较大的程序来说,往往把其中相对独立的算法和功能对于较大的程序来说,往往把其中相对独立的算法和功能对于较大的程序来说,往往把其中相对独立的算法和功能定义成一个独立的函数,以供需要的地方调用。定义成一个独立的函数,以供需要的地方调用。定义成一个独立的函数,以供需要的地方调用。定义成一个独立的函数,以供需要的地方调用。将一个程序分解成多个函数有如下将一个程序分解成多个函数有如下将一个程序分解成多个函数有如下将一个
4、程序分解成多个函数有如下优点优点优点优点:(1 1)减少代码的重复现象。减少代码的重复现象。减少代码的重复现象。减少代码的重复现象。(2 2)便于分工合作。便于分工合作。便于分工合作。便于分工合作。(3 3)便于阅读。便于阅读。便于阅读。便于阅读。(4 4)便于独立算法的代码移植。便于独立算法的代码移植。便于独立算法的代码移植。便于独立算法的代码移植。例例例例8.18.1void void main()main()p1();p1();p2();p2();p1();p1();p1()p1()printf(“*n”);printf(“*n”);p2()p2()printf(“_ _ _ _ _Ho
5、w_do_you_do!n”);printf(“_ _ _ _ _How_do_you_do!n”);运行结果:运行结果:运行结果:运行结果:*_ _ _ _ _How_do_you_do!_ _ _ _ _ _ _ _How_do_you_do!_ _ _ _*说明:说明:说明:说明:(1 1)编译的单位是文件而不是函数;)编译的单位是文件而不是函数;)编译的单位是文件而不是函数;)编译的单位是文件而不是函数;(2 2)一个完整的程序可由若干个文件组成,可用项目或文件包含)一个完整的程序可由若干个文件组成,可用项目或文件包含)一个完整的程序可由若干个文件组成,可用项目或文件包含)一个完整的程
6、序可由若干个文件组成,可用项目或文件包含的方法对其编译;的方法对其编译;的方法对其编译;的方法对其编译;(3 3)C C执行总是从执行总是从执行总是从执行总是从mainmain函数开始执行,调用其它函数后又返回到函数开始执行,调用其它函数后又返回到函数开始执行,调用其它函数后又返回到函数开始执行,调用其它函数后又返回到mainmain函数;函数;函数;函数;(4 4)函数定义是独立的、平等的,不能嵌套定义但可相互调用;)函数定义是独立的、平等的,不能嵌套定义但可相互调用;)函数定义是独立的、平等的,不能嵌套定义但可相互调用;)函数定义是独立的、平等的,不能嵌套定义但可相互调用;(5 5)函数的
7、类型)函数的类型)函数的类型)函数的类型:标准库函数,由系统提供,用户直接使用标准库函数,由系统提供,用户直接使用标准库函数,由系统提供,用户直接使用标准库函数,由系统提供,用户直接使用 用户定义的函数用户定义的函数用户定义的函数用户定义的函数(6)(6)函数的形式函数的形式函数的形式函数的形式:无参函数无参函数无参函数无参函数 主调函数无数据传给被调函数主调函数无数据传给被调函数主调函数无数据传给被调函数主调函数无数据传给被调函数,可带或不带返回值可带或不带返回值可带或不带返回值可带或不带返回值.有参函数有参函数有参函数有参函数 主调函数与被调函数间有参数传递主调函数与被调函数间有参数传递主
8、调函数与被调函数间有参数传递主调函数与被调函数间有参数传递,主调函数可将主调函数可将主调函数可将主调函数可将实参传送给被调函数的形参实参传送给被调函数的形参实参传送给被调函数的形参实参传送给被调函数的形参,被调函数的数据可传回主调函数。被调函数的数据可传回主调函数。被调函数的数据可传回主调函数。被调函数的数据可传回主调函数。8.2 8.2 函数定义的一般形式函数定义的一般形式1.1.无参函数的定义形式:无参函数的定义形式:无参函数的定义形式:无参函数的定义形式:类型标识符类型标识符类型标识符类型标识符 函数名(函数名(函数名(函数名()声明部分声明部分声明部分声明部分 语句部分语句部分语句部分
9、语句部分 注:无参函数一般不返回函数值,故类型标识符可省。注:无参函数一般不返回函数值,故类型标识符可省。注:无参函数一般不返回函数值,故类型标识符可省。注:无参函数一般不返回函数值,故类型标识符可省。2.2.有参函数的定义形式:有参函数的定义形式:有参函数的定义形式:有参函数的定义形式:类型标识符类型标识符类型标识符类型标识符 函数名(形式参数表列)函数名(形式参数表列)函数名(形式参数表列)函数名(形式参数表列)声明部分声明部分声明部分声明部分 语句部分语句部分语句部分语句部分 其中:其中:其中:其中:类型标识符:指出函数返回值的数据类型类型标识符:指出函数返回值的数据类型类型标识符:指出
10、函数返回值的数据类型类型标识符:指出函数返回值的数据类型 (int,float,charint,float,char等等等等)函数名:合法的标识符;函数名:合法的标识符;函数名:合法的标识符;函数名:合法的标识符;形参表列:接收主调函数传递过来的实参,其中包括对形形参表列:接收主调函数传递过来的实参,其中包括对形形参表列:接收主调函数传递过来的实参,其中包括对形形参表列:接收主调函数传递过来的实参,其中包括对形参类型的声明(老版本中形参类型进一步声明放在下一行)。参类型的声明(老版本中形参类型进一步声明放在下一行)。参类型的声明(老版本中形参类型进一步声明放在下一行)。参类型的声明(老版本中形
11、参类型进一步声明放在下一行)。形参类型:与实参类型要一致。形参类型:与实参类型要一致。形参类型:与实参类型要一致。形参类型:与实参类型要一致。:称函数体,包括:称函数体,包括:称函数体,包括:称函数体,包括 声明部分:定义局部变量的数据类型;声明部分:定义局部变量的数据类型;声明部分:定义局部变量的数据类型;声明部分:定义局部变量的数据类型;语句部分:完成函数功能的若干执行语句。语句部分:完成函数功能的若干执行语句。语句部分:完成函数功能的若干执行语句。语句部分:完成函数功能的若干执行语句。例:例:例:例:int max(int x,int y)int max(int x,int y)int
12、z;int z;z=xy?x:y ;return(z);z=xy?x:y ;return(z);3.3.空函数的定义形式空函数的定义形式空函数的定义形式空函数的定义形式类型说明符类型说明符类型说明符类型说明符 函数名(函数名(函数名(函数名()例:例:例:例:dummi()dummi()空函数不作任何操作,但是合法,它对调试程序或以后在此空函数不作任何操作,但是合法,它对调试程序或以后在此空函数不作任何操作,但是合法,它对调试程序或以后在此空函数不作任何操作,但是合法,它对调试程序或以后在此处补充完整的函数体是处补充完整的函数体是处补充完整的函数体是处补充完整的函数体是 有作用的。有作用的。有
13、作用的。有作用的。4.4.对形参声明的传统方式对形参声明的传统方式对形参声明的传统方式对形参声明的传统方式传统方式中,形参类型说明在函数定义的第传统方式中,形参类型说明在函数定义的第传统方式中,形参类型说明在函数定义的第传统方式中,形参类型说明在函数定义的第2 2行行行行如:传统形参声明形式如:传统形参声明形式如:传统形参声明形式如:传统形参声明形式int max(x,y)int max(x,y)int x,y;int x,y;int z;int z;z=xy?x:y;z=xy?x:y;return(z);return(z);新版本形参声明形式新版本形参声明形式新版本形参声明形式新版本形参声明
14、形式int max(int x,int y)int max(int x,int y)int z;int z;z=xy?x:y;z=xy?x:y;return(z);return(z);以上两种定义形式在以上两种定义形式在以上两种定义形式在以上两种定义形式在Turbo CTurbo C中都认可中都认可中都认可中都认可8.3 8.3 函数参数和函数的值函数参数和函数的值8.3.1 8.3.1 8.3.1 8.3.1 形式参数和实际参数形式参数和实际参数形式参数和实际参数形式参数和实际参数实际参数:实际参数:实际参数:实际参数:主调函数中提供的数据。主调函数中提供的数据。主调函数中提供的数据。主调函
15、数中提供的数据。可以是常量、变量、表达式等,是具体的数值。可以是常量、变量、表达式等,是具体的数值。可以是常量、变量、表达式等,是具体的数值。可以是常量、变量、表达式等,是具体的数值。形式参数:形式参数:形式参数:形式参数:被调函数中用以接收主调函数数据的变量。被调函数中用以接收主调函数数据的变量。被调函数中用以接收主调函数数据的变量。被调函数中用以接收主调函数数据的变量。被调用函数名后面括号内的若干变量名。被调用函数名后面括号内的若干变量名。被调用函数名后面括号内的若干变量名。被调用函数名后面括号内的若干变量名。例例例例8.2 8.2 调用函数时的数据传递调用函数时的数据传递调用函数时的数据
16、传递调用函数时的数据传递void void main()main()int a,b,c;int a,b,c;scanf(%d%d”,&a,&b);scanf(%d%d”,&a,&b);c=max(a,b);c=max(a,b);printf(“Max is%d n”,c);printf(“Max is%d n”,c);max(int x,int y)max(int x,int y)int z;int z;z=xy?x:y;z=xy?x:y;return(z);return(z);输入:输入:输入:输入:-100 200-100 200 Max is 200 Max is 200关于形、实参的说
17、明:关于形、实参的说明:关于形、实参的说明:关于形、实参的说明:1.1.形参只有在函数调用时才分配存储单元,调用结束后,释放形参只有在函数调用时才分配存储单元,调用结束后,释放形参只有在函数调用时才分配存储单元,调用结束后,释放形参只有在函数调用时才分配存储单元,调用结束后,释放所分配的单元;所分配的单元;所分配的单元;所分配的单元;2.2.实参可以是常量、变量、表达式,总之要有确定的值,当函实参可以是常量、变量、表达式,总之要有确定的值,当函实参可以是常量、变量、表达式,总之要有确定的值,当函实参可以是常量、变量、表达式,总之要有确定的值,当函数调用时,将实参的值传递给形参,若是数组名,则传
18、送的数调用时,将实参的值传递给形参,若是数组名,则传送的数调用时,将实参的值传递给形参,若是数组名,则传送的数调用时,将实参的值传递给形参,若是数组名,则传送的是数组的首地址。是数组的首地址。是数组的首地址。是数组的首地址。3.3.被调函数中,形参类型必须指定,以便分配存储单元。被调函数中,形参类型必须指定,以便分配存储单元。被调函数中,形参类型必须指定,以便分配存储单元。被调函数中,形参类型必须指定,以便分配存储单元。4.4.实参、形参的数据类型一致,赋值要兼容,顺序要一致。实参、形参的数据类型一致,赋值要兼容,顺序要一致。实参、形参的数据类型一致,赋值要兼容,顺序要一致。实参、形参的数据类
19、型一致,赋值要兼容,顺序要一致。如果形、实参类型不一致时,则按赋值规则进行。通常被调函如果形、实参类型不一致时,则按赋值规则进行。通常被调函如果形、实参类型不一致时,则按赋值规则进行。通常被调函如果形、实参类型不一致时,则按赋值规则进行。通常被调函数放在主调函数之前,以便编译系统对函数类型和形参类型作数放在主调函数之前,以便编译系统对函数类型和形参类型作数放在主调函数之前,以便编译系统对函数类型和形参类型作数放在主调函数之前,以便编译系统对函数类型和形参类型作合法性检查。若被调函数在主调函数之后,一般要对被调函数合法性检查。若被调函数在主调函数之后,一般要对被调函数合法性检查。若被调函数在主调
20、函数之后,一般要对被调函数合法性检查。若被调函数在主调函数之后,一般要对被调函数作原型声明。作原型声明。作原型声明。作原型声明。void void main()main()float a=4.5,b=4.5;float a=4.5,b=4.5;int abc(int,int);int abc(int,int);abc(a,b);abc(a,b);abc(int x,int y)abc(int x,int y)printf(“x=%d,y=%dn”,x,y);printf(“x=%d,y=%dn”,x,y);结果:结果:结果:结果:x=4,y=4x=4,y=45.5.若被调函数类型为非整形,要在
21、主调函数中对被调函数作原若被调函数类型为非整形,要在主调函数中对被调函数作原若被调函数类型为非整形,要在主调函数中对被调函数作原若被调函数类型为非整形,要在主调函数中对被调函数作原形声明。另外若被调函数在主调函数之前定义,则原形声明形声明。另外若被调函数在主调函数之前定义,则原形声明形声明。另外若被调函数在主调函数之前定义,则原形声明形声明。另外若被调函数在主调函数之前定义,则原形声明可省,因为编译系统已经知道被调函数的类型的其形参的个可省,因为编译系统已经知道被调函数的类型的其形参的个可省,因为编译系统已经知道被调函数的类型的其形参的个可省,因为编译系统已经知道被调函数的类型的其形参的个数的
22、类型了。数的类型了。数的类型了。数的类型了。6.6.实参对形参的数据传送是值传送,也是单向传送,当被调函实参对形参的数据传送是值传送,也是单向传送,当被调函实参对形参的数据传送是值传送,也是单向传送,当被调函实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函数实参的值。数的形参发生变化时,并不改变主调函数实参的值。数的形参发生变化时,并不改变主调函数实参的值。数的形参发生变化时,并不改变主调函数实参的值。例例例例8.2.1 8.2.1 形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元 v
23、oid void main()main()int a=2,b=3;int a=2,b=3;printf(“a=%d,b=%d n”,a,b);printf(“a=%d,b=%d n”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);printf(“&a=%x,&b=%xn”,&a,&b);add(a,b);add(a,b);printf(“a=%d,b=%dn”,a,b);printf(“a=%d,b=%dn”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);printf(“&a=%x,&b=%xn”,&a,&b);add(int x,int y)add
24、(int x,int y)x=x+8;y=y+12;x=x+8;y=y+12;printf(“x=%d,y=%d n”,x,y);printf(“x=%d,y=%d n”,x,y);printf(“&x=%x,&y=%xn”,&x,&y);printf(“&x=%x,&y=%xn”,&x,&y);2+8=102+8=103+12=153+12=152 23 3ffd2ffd2ffd4ffd4ffd6ffd6ffd8ffd8x xa ay yb b运行结果:运行结果:运行结果:运行结果:a=2,b=3a=2,b=3&a=ffd6,&b=ffd8&a=ffd6,&b=ffd8x=10,y=15x=
25、10,y=15&x=ffd2,&y=ffd4&x=ffd2,&y=ffd4a=2,b=3a=2,b=3&a=ffd6,&b=ffd8&a=ffd6,&b=ffd8 8.3.2 函数的返回值函数的返回值调用一个函数一般都希望返回一个确定的值。调用一个函数一般都希望返回一个确定的值。调用一个函数一般都希望返回一个确定的值。调用一个函数一般都希望返回一个确定的值。有关函数值的几点说明:有关函数值的几点说明:有关函数值的几点说明:有关函数值的几点说明:1.1.若需要返回值则用若需要返回值则用若需要返回值则用若需要返回值则用returnreturn语句;语句;语句;语句;2.2.被调函数中可用多个被调函
26、数中可用多个被调函数中可用多个被调函数中可用多个returnreturn语句,执行哪一个由程序执行情语句,执行哪一个由程序执行情语句,执行哪一个由程序执行情语句,执行哪一个由程序执行情况来定。况来定。况来定。况来定。例:函数中有如下语句例:函数中有如下语句例:函数中有如下语句例:函数中有如下语句 if(ab)return(a);if(ab)return(a);else return(b);else return(b);3.return3.return后面的括号可省,如:后面的括号可省,如:后面的括号可省,如:后面的括号可省,如:return a;return a;4.return 4.retu
27、rn 后的值可以是一个表达式,如:后的值可以是一个表达式,如:后的值可以是一个表达式,如:后的值可以是一个表达式,如:return(x y?x:y);return(x y?x:y);5.5.函数值的类型是在定义函数时指定的函数值的类型是在定义函数时指定的函数值的类型是在定义函数时指定的函数值的类型是在定义函数时指定的 如:如:如:如:int max(x,y)int max(x,y)float min(a,b)float min(a,b)double abc(d1,d2)double abc(d1,d2)6.6.语句语句语句语句return(a,b,c)return(a,b,c)是合法的,返回表
28、达式是合法的,返回表达式是合法的,返回表达式是合法的,返回表达式c c的值。的值。的值。的值。注意:注意:注意:注意:(1)(1)函数定义时,函数名的括号后无函数定义时,函数名的括号后无函数定义时,函数名的括号后无函数定义时,函数名的括号后无“;”;(2)(2)未加类型说明的函数自动按整型处理;未加类型说明的函数自动按整型处理;未加类型说明的函数自动按整型处理;未加类型说明的函数自动按整型处理;(3)(3)定义函数时,函数值的类型一般与定义函数时,函数值的类型一般与定义函数时,函数值的类型一般与定义函数时,函数值的类型一般与return return 后面表达式的类后面表达式的类后面表达式的类
29、后面表达式的类 型一致,若不一致,型一致,若不一致,型一致,若不一致,型一致,若不一致,则以函数值为准。则以函数值为准。则以函数值为准。则以函数值为准。例例例例8.3 8.3 函数值类型为整型,而返回值的类型是实型,最后以整函数值类型为整型,而返回值的类型是实型,最后以整函数值类型为整型,而返回值的类型是实型,最后以整函数值类型为整型,而返回值的类型是实型,最后以整型值返回。型值返回。型值返回。型值返回。void void main()main()int max(float,float);int max(float,float);float a,b;int c;float a,b;int c;
30、scanf(“%f%f”,&a,&b);scanf(“%f%f”,&a,&b);c=max(a,b);printf(“max is%d n”,c);c=max(a,b);printf(“max is%d n”,c);max(floatmax(float x,float y)x,float y)float z;z=xy?x:y;float z;z=xy?x:y;return(z);return(z);输入:输入:输入:输入:1.5 2.51.5 2.5 输出:输出:输出:输出:max is 2max is 27.7.函数中无函数中无函数中无函数中无return return 语句时,可能返回一个
31、不确定或无用的值语句时,可能返回一个不确定或无用的值语句时,可能返回一个不确定或无用的值语句时,可能返回一个不确定或无用的值 例例例例8.3.18.3.1 void void main()main()int a,b,c;a=p1();b=p2();c=p1();int a,b,c;a=p1();b=p2();c=p1();printf(“a=%d,b=%d,c=%d n”,a,b,c);printf(“a=%d,b=%d,c=%d n”,a,b,c);p1()printf(“*n”);p1()printf(“*n”);p2()printf(“I am happy!n”);p2()printf(
32、“I am happy!n”);运行结果:运行结果:运行结果:运行结果:*I am happy!I am happy!*a=6,b=12,c=6a=6,b=12,c=68.8.为明确表示不带返回值,可用为明确表示不带返回值,可用为明确表示不带返回值,可用为明确表示不带返回值,可用voidvoid(无值,空类型)定义函无值,空类型)定义函无值,空类型)定义函无值,空类型)定义函数。数。数。数。例例例例8.3.28.3.2void main()void main()int a,b,c;int a,b,c;a=p1();a=p1();b=p2();b=p2();c=p1();c=p1();print
33、f(“a=%d,b=%d,c=%d n”,a,b,c);printf(“a=%d,b=%d,c=%d n”,a,b,c);void p1()void p1()printf(“*n”);printf(“*n”);void p2()void p2()printf(“I am happy!n”);printf(“I am happy!n”);编译时指出:编译时指出:编译时指出:编译时指出:Type mismatch in redeclartion of p1,p2Type mismatch in redeclartion of p1,p2意即:在定义函数意即:在定义函数意即:在定义函数意即:在定义函
34、数 p1,p2 p1,p2 时类型不匹配时类型不匹配时类型不匹配时类型不匹配8.4 8.4 函数的调用函数的调用主调函数:主动去调用其它函数主调函数:主动去调用其它函数主调函数:主动去调用其它函数主调函数:主动去调用其它函数被调函数:被其它函数所调用被调函数:被其它函数所调用被调函数:被其它函数所调用被调函数:被其它函数所调用8.4.1 8.4.1 函数调用的一般形式函数调用的一般形式 函数名(实参表列)函数名(实参表列)函数名(实参表列)函数名(实参表列)操作:把控制和实参传送给被调函数,当无参时,实参表列为操作:把控制和实参传送给被调函数,当无参时,实参表列为操作:把控制和实参传送给被调函
35、数,当无参时,实参表列为操作:把控制和实参传送给被调函数,当无参时,实参表列为空,但(空,但(空,但(空,但()不能省。)不能省。)不能省。)不能省。函数名:是已存在的被调用的函数;函数名:是已存在的被调用的函数;函数名:是已存在的被调用的函数;函数名:是已存在的被调用的函数;实参表列:有确定值的数据,当有多个实参时,实参间用实参表列:有确定值的数据,当有多个实参时,实参间用实参表列:有确定值的数据,当有多个实参时,实参间用实参表列:有确定值的数据,当有多个实参时,实参间用“,”分隔,通常形实、参个数要相等,类型要一致,实参求值顺分隔,通常形实、参个数要相等,类型要一致,实参求值顺分隔,通常形
36、实、参个数要相等,类型要一致,实参求值顺分隔,通常形实、参个数要相等,类型要一致,实参求值顺序在序在序在序在Turbo CTurbo C中是中是中是中是从右向左从右向左从右向左从右向左。例例例例8.4 8.4 实参求值顺序从右向左实参求值顺序从右向左实参求值顺序从右向左实参求值顺序从右向左void main()void main()int i=2,p;int i=2,p;p=f(i,+i);printf(“p=%d,i=%d n”,p,i);p=f(i,+i);printf(“p=%d,i=%d n”,p,i);int f(int a,int b)int f(int a,int b)int c
37、;int c;if(ab)c=1;if(ab)c=1;else if(a=b)c=0;else if(a=b)c=0;else c=-1;else c=-1;return(c);return(c);运行结果:运行结果:运行结果:运行结果:p=0,i=3p=0,i=3若将参数改为若将参数改为若将参数改为若将参数改为f(i,i+),f(i,i+),则结果为:则结果为:则结果为:则结果为:p=1,i=3p=1,i=38.4.2 8.4.2 函数的调用方法函数的调用方法1.1.函数语句:独立语句去调用函数;函数语句:独立语句去调用函数;函数语句:独立语句去调用函数;函数语句:独立语句去调用函数;如:如
38、:如:如:f1();f1();2.2.函数表达式:函数调用出现在表达式中,其函数返回的函数表达式:函数调用出现在表达式中,其函数返回的函数表达式:函数调用出现在表达式中,其函数返回的函数表达式:函数调用出现在表达式中,其函数返回的值参加整个表达式的运算。值参加整个表达式的运算。值参加整个表达式的运算。值参加整个表达式的运算。如:如:如:如:c=max(a+b)+min(c,d);c=max(a+b)+min(c,d);3.3.函数参数:函数调用作为另一个函数的参数,如:函数参数:函数调用作为另一个函数的参数,如:函数参数:函数调用作为另一个函数的参数,如:函数参数:函数调用作为另一个函数的参数
39、,如:m=max(a,max(b,c);m=max(a,max(b,c);8.4.3 8.4.3 对被调用函数的声明和函数原型对被调用函数的声明和函数原型被调函数应具备的条件被调函数应具备的条件被调函数应具备的条件被调函数应具备的条件1.1.被调函数必须存在(标准或用户定义),如不在同一文件被调函数必须存在(标准或用户定义),如不在同一文件被调函数必须存在(标准或用户定义),如不在同一文件被调函数必须存在(标准或用户定义),如不在同一文件中,可用项目或文件包含的方法将各被调用函数连接起来。中,可用项目或文件包含的方法将各被调用函数连接起来。中,可用项目或文件包含的方法将各被调用函数连接起来。中
40、,可用项目或文件包含的方法将各被调用函数连接起来。2.2.若使用库函数,应在文件开头用若使用库函数,应在文件开头用若使用库函数,应在文件开头用若使用库函数,应在文件开头用#include#include命令将调用库函命令将调用库函命令将调用库函命令将调用库函数时用到的宏定义信息包含到本文件中来。数时用到的宏定义信息包含到本文件中来。数时用到的宏定义信息包含到本文件中来。数时用到的宏定义信息包含到本文件中来。如:如:如:如:#include “stdio.h”#include “stdio.h”#include “math.h”#include “math.h”3.3.若主调和被调函数在同一文件
41、中,一般应在主调函数中对若主调和被调函数在同一文件中,一般应在主调函数中对若主调和被调函数在同一文件中,一般应在主调函数中对若主调和被调函数在同一文件中,一般应在主调函数中对被调函数的类型作声明被调函数的类型作声明被调函数的类型作声明被调函数的类型作声明形式:形式:形式:形式:类型标识符类型标识符类型标识符类型标识符 被调用函数名(类型被调用函数名(类型被调用函数名(类型被调用函数名(类型 形参形参形参形参.););););例例例例8.5 8.5 在主调函数中,对被调函数的数据类型进行说明在主调函数中,对被调函数的数据类型进行说明在主调函数中,对被调函数的数据类型进行说明在主调函数中,对被调函
42、数的数据类型进行说明main()main()float add(float x,float y);/*float add(float x,float y);/*声明:函数类型、名,形参类型、声明:函数类型、名,形参类型、声明:函数类型、名,形参类型、声明:函数类型、名,形参类型、*/float a,b,c;float a,b,c;/*/*个数,通知编译系统个数,通知编译系统个数,通知编译系统个数,通知编译系统*/scanf(%f%f”,&a,&b);scanf(%f%f”,&a,&b);c=add(a,b);printf(“sum is%f n”,c);c=add(a,b);printf(“s
43、um is%f n”,c);float add(float x,float y)/*float add(float x,float y)/*定义:功能的确定,完整独立的单位定义:功能的确定,完整独立的单位定义:功能的确定,完整独立的单位定义:功能的确定,完整独立的单位*/float z;float z;z=x+y;return(z);z=x+y;return(z);输入:输入:输入:输入:3.6 6.53.6 6.5输出:输出:输出:输出:sum is 10.10000sum is 10.10000问题:问题:问题:问题:(1 1)若不对函数类型进行声明,则指出:在重定义函)若不对函数类型进行
44、声明,则指出:在重定义函)若不对函数类型进行声明,则指出:在重定义函)若不对函数类型进行声明,则指出:在重定义函 数数数数addadd时,类型不匹配;时,类型不匹配;时,类型不匹配;时,类型不匹配;(2 2)在声明时指出类型,若定义时没有指出类型,编译指出:)在声明时指出类型,若定义时没有指出类型,编译指出:)在声明时指出类型,若定义时没有指出类型,编译指出:)在声明时指出类型,若定义时没有指出类型,编译指出:定义定义定义定义addadd时类型不匹配(此处是实型)。时类型不匹配(此处是实型)。时类型不匹配(此处是实型)。时类型不匹配(此处是实型)。函数声明(原型):与函数首部一致。函数声明(原
45、型):与函数首部一致。函数声明(原型):与函数首部一致。函数声明(原型):与函数首部一致。有关函数的定义、声明、返回值等概念有关函数的定义、声明、返回值等概念有关函数的定义、声明、返回值等概念有关函数的定义、声明、返回值等概念1.1.函数定义:对函数功能的确定,指定函数名、函数值类型、函数定义:对函数功能的确定,指定函数名、函数值类型、函数定义:对函数功能的确定,指定函数名、函数值类型、函数定义:对函数功能的确定,指定函数名、函数值类型、形参及类型、函数体等,它是完整的、独立的函数单位。形参及类型、函数体等,它是完整的、独立的函数单位。形参及类型、函数体等,它是完整的、独立的函数单位。形参及类
46、型、函数体等,它是完整的、独立的函数单位。2.2.函数声明:也称函数原型,其作用是把函数的名字、函数类函数声明:也称函数原型,其作用是把函数的名字、函数类函数声明:也称函数原型,其作用是把函数的名字、函数类函数声明:也称函数原型,其作用是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便调用函型以及形参的类型、个数和顺序通知编译系统,以便调用函型以及形参的类型、个数和顺序通知编译系统,以便调用函型以及形参的类型、个数和顺序通知编译系统,以便调用函数时进行对照检查。数时进行对照检查。数时进行对照检查。数时进行对照检查。函数声明(原型)的形式:函数声明(原型)的形式:函数声明(原型
47、)的形式:函数声明(原型)的形式:(1)(1)函数类型函数类型函数类型函数类型 函数名函数名函数名函数名(参数类型参数类型参数类型参数类型1,1,参数类型参数类型参数类型参数类型2.)2.);(2)(2)函数类型函数类型函数类型函数类型 函数名函数名函数名函数名(参数类型参数类型参数类型参数类型1 1 参数名参数名参数名参数名1,1,参数类型参数类型参数类型参数类型2 2 参数名参数名参数名参数名2.)2.);3.3.当函数返回的值为整型或字符型时,可不必声明。当函数返回的值为整型或字符型时,可不必声明。当函数返回的值为整型或字符型时,可不必声明。当函数返回的值为整型或字符型时,可不必声明。4
48、.4.被调用函数在主调函数之前定义时,在主调函数中可不必声被调用函数在主调函数之前定义时,在主调函数中可不必声被调用函数在主调函数之前定义时,在主调函数中可不必声被调用函数在主调函数之前定义时,在主调函数中可不必声明。明。明。明。例例例例8.5.1 8.5.1 被调函数出现在主调函数之前,则在主调函数中不必被调函数出现在主调函数之前,则在主调函数中不必被调函数出现在主调函数之前,则在主调函数中不必被调函数出现在主调函数之前,则在主调函数中不必声明声明声明声明float add(float x,float y)float add(float x,float y)float z;z=x+y;ret
49、urn(z);float z;z=x+y;return(z);main()main()float a,b,c;float a,b,c;scanf(“%f%f”,&a,&b);scanf(“%f%f”,&a,&b);c=add(a,b);c=add(a,b);printf(“%f n”,c);printf(“%f n”,c);输入:输入:输入:输入:3.6 6.53.6 6.5输出:输出:输出:输出:sum is 10.100000sum is 10.100000主调函数中没对被调函数的返回值进行类型声明,原因是:主调函数中没对被调函数的返回值进行类型声明,原因是:主调函数中没对被调函数的返回值
50、进行类型声明,原因是:主调函数中没对被调函数的返回值进行类型声明,原因是:编译系统已经预知定义的函数的类型,并进行自动处理。编译系统已经预知定义的函数的类型,并进行自动处理。编译系统已经预知定义的函数的类型,并进行自动处理。编译系统已经预知定义的函数的类型,并进行自动处理。5.5.如果在所有函数定义之前,在文件的开头,在函数的外部如果在所有函数定义之前,在文件的开头,在函数的外部如果在所有函数定义之前,在文件的开头,在函数的外部如果在所有函数定义之前,在文件的开头,在函数的外部对函数的类型作了声明,则在各主调函数中不必对所调用的对函数的类型作了声明,则在各主调函数中不必对所调用的对函数的类型作