对被调用函数的声明和函数原型【例7.4】输入两个实数,用一个函数求出它们之和#include <stdio.h>//定义add函数int main()floatadd(floatxfloaty)//对add函数作声明floatz;floatadd(floatx,floaty):floata,b.c;z=x+y.1/提示输入//把变量的值作为函数值返回printf("Pleaseenteraandb:"):retum(z):1//输入两个实数scanf("%f.%f"&a,&b);c=add(a.b);//调用add函数口+CAWINDOWS\system32/cmd.exeprintf("sum is %f(n",c):1/输出两数之和and b:3.6,6.5return 0:is10.100000按任意键继续函数的声明和函数定义中的第1行(函数首部)基本上是相同的:只差一个分号(函数声明比函数定义中的首行多一个分号)。函数的首行(即函数首部)称为函数原型(functionprototype)。因为在函数的首部包含了检查调用函数是否合法的基本信息(它包括了函数名、函数值类型、参数个数、参数类型和参数顺序)因此,在函数调用时检查函数原型是否与函数声明一致。这样就能保证函数的正确调用
对被调用函数的声明和函数原型 【例7.4】输入两个实数,用一个函数求出它们之和。 函数的声明和函数定义中的第1行(函数首部)基本上是相同的,只差一个分号(函数声明比函数定义中的首行多一个分号)。 函数的首行(即函数首部)称为函数原型(function prototype)。 因为在函数的首部包含了检查调用函数是否合法的基本信息(它包括了函数名、函数值类型、参数个数、参数类型和参数顺序), 因此,在函数调用时检查函数原型是否与函数声明一致。这样就能保证函数的正确调用。 #include <stdio.h> int main() { float add(float x, float y); //对add函数作声明 float a,b,c; printf("Please enter a and b:"); //提示输入 scanf("%f,%f",&a,&b); //输入两个实数 c=add(a,b); //调用add函数 printf("sum is %f\n",c); //输出两数之和 return 0; } float add(float x,float y) //定义add函数 { float z; z=x+y; return(z); //把变量z的值作为函数值返回 }
对被调用函数的声明和函数原型函数类型函数名(参数类型1参数名1,参数类型2参数名2参数类型n参数名n)或函数类型函数名(参数类型1,参数类型2参数类型n)在函数声明中的形参名可以floatadd(floatx,floaty):/不写参数名,只写参数类型floatadd(float,float):省写,而只写形参的类型。//参数名不用xy,而用a.b。合法float add(float a, floatb)charletter(char,char);floatf(float,float);inti(float,float))如果已在文件的开头(在所//所有函数之前,且在函数外部进行函数声明有函数之前),已对本文件intmainO{)//在main函数中要调用letter,f和i函数,不必再对所调用的这3个函数进行声明中所调用的函数进行了声明//定义letter函数charletter(charc1,charc2) ()则在各函数中不必对其所调/定义涵数float f(float x,floaty) ()//定义函数用的函数再作声明。inti(floatj.floatk))注意对函数的定义”和“声明”不是同一回事。函数的定义是指对函数功能的确立,包括指定函数名、函数值类型、形参及其类型以及函数体等,它是一个完整的、独立的函数单位。而函数的声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查,它不包含函数体
对被调用函数的声明和函数原型 在函数声明中的形参名可以 省写,而只写形参的类型。 如果已在文件的开头(在所 有函数之前),已对本文件 中所调用的函数进行了声明, 则在各函数中不必对其所调 用的函数再作声明。 float add(float x, float y); float add(float, float); //不写参数名,只写参数类型 float add(float a, float b); //参数名不用x,y,而用a,b。合法 函数类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ., 参数类型n 参数名n); 或 函数类型 函数名(参数类型1, 参数类型2, ., 参数类型n); 注意 • 对函数的“定义”和“声明”不是同一回事。函数的定义是指对函数功能的确立,包括指定函数名、函数值类型、形 参及其类型以及函数体等,它是一个完整的、独立的函数单位。而函数的声明的作用则是把函数的名字、函数类型以 及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查,它不包含函数体。 char letter(char, char); float f(float,float); int i (float,float); //所有函数之前,且在函数外部进行函数声明 int main() { . } //在main函数中要调用letter,f和i函数,不必再对所调用的这3个函数进行声明 char letter(char c1,char c2) { . } //定义letter函数 float f(float x,float y) { . } //定义f函数 int i(float j,float k) { . } //定义i函数
函数的嵌套调用C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。①执行main函数的开头部分②遇函数调用语句,调用函数a,流程转去a函数a函数b函数main函数③执行a函数的开头部分;①234④遇函数调用语句,调用函数b流程转去函数b5调用a函数调用b函数5执行b函数,如果再无其他嵌套的函数,则完成b函数的全部操作;③返回到a函数中调用b函数的位置;986T①继续执行a函数中尚未执行的部分,直到a函数结束;结束8返回main函数中调用a函数的位置;③继续执行main函数的剩余部分直到结束
函数的嵌套调用 ① 执行main函数的开头部分; ② 遇函数调用语句,调用函数a,流程转去a函数; ③ 执行a函数的开头部分; ④ 遇函数调用语句,调用函数b,流程转去函数b; ⑤ 执行b函数,如果再无其他嵌套的函数,则完成b函数的全部操作; ⑥ 返回到a函数中调用b函数的位置; ⑦ 继续执行a函数中尚未执行的部分,直到a函数结束; ⑧ 返回main函数中调用a函数的位置; ⑨ 继续执行main函数的剩余部分直到结束。 C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一 个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个 函数。 main函数 a函数 b函数 ① ② ③ ④ 调用a函数 调用b函数 ⑤ ⑨ ⑧ ⑦ ⑥ 结 束
口CAWINDOWS/system32)cmd.exeleaseenter 4 interger mumbers:12 45-6.89函数的嵌套调用9x=89请按任意键继续【例7.5】输入4个整数,找出其中最大的数。用函数的嵌套调用来处理#include<stdio.h>int m;+int main()m=max2(a.b)//调用max2函数,得到a和b中的大者,放在m中intmax4(inta.intb.intc.intd)://对max4的函数声明m=max2(m.c)//调用max2函数,得到a.b.c中的大者,放在m中inta,b.c.d.max.m=max2m.d)://调用max2函数,得到a.b.c.d中的大者,放在m中printf("Pleaseenter4intergernumbers:)://提示输入4个数return(m)://把m作为函数值带回main函数寻//输入4个数scanf("%d%d%d%d"&a.&b.&c.&d):max=max4(ab.c,d)://调用max4函数,得到4个数中的最大者//定义max2函数printf("max=%d\n".max))://输出4个数中的最大者intmax2(inta.intb)return O;if(a>=b)//若a≥b,将a作为函数返回值return a:else一//定义max4函数int max4(int a,int b,int c.int d)return b;//若a<b,将b作为函数返回值int max2(inta,int b)://对max2的函数声明子在主函数中要调用max4函数,因此在主函数的开头要对max4函数作声明。在max4函数中3次调用max2函数,因此在max4函数的开头要对max2函数作声明。由于在主函数中没有直接调用max2函数,因此在主函数中不必对max2函数作声明,只须在max4函数中作声明即可。max4函数执行过程:第1次调用max2函数得到的函数值是a和b中的大者,把它赋给变量m,第2次调用max2得到m和c中的大者,也就是a.b.c中的最大者,再把它赋给变量m。第3次调用max2得到m和d中的大者,也就是a.b.c.d中的最大者,再把它赋给变量m。这是一种递推方法,先求出2个数的大者,再以此为基础求出3个数的大者;再以此为基础求出4个数的大者。m的值一次一次地变化,直到实现最终要求
函数的嵌套调用 【例7.5】输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。 #include <stdio.h> int main() { int max4(int a,int b,int c,int d); //对max4的函数声明 int a,b,c,d,max; printf("Please enter 4 interger numbers:"); //提示输入4个数 scanf("%d %d %d %d",&a,&b,&c,&d); //输入4个数 max=max4(a,b,c,d); //调用max4函数,得到4个数中的最大者 printf("max=%d \n",max); //输出4个数中的最大者 return 0; } int max4(int a,int b,int c,int d) //定义max4函数 { int max2(int a,int b); //对max2的函数声明 int m; m=max2(a,b);//调用max2函数,得到a和b中的大者,放在m中 m=max2(m,c);//调用max2函数,得到a,b,c中的大者,放在m中 m=max2(m,d);//调用max2函数,得到a,b,c,d中的大者,放在m中 return(m); //把m作为函数值带回main函数 } int max2(int a,int b) //定义max2函数 { if(a>=b) return a; //若a≥b,将a作为函数返回值 else return b; //若a<b,将b作为函数返回值 } 在主函数中要调用max4函数,因此在主函数的开头要对max4函数作声明。在max4函数中3次调用max2函数,因此在max4函数的开头要对 max2函数作声明。由于在主函数中没有直接调用max2函数,因此在主函数中不必对max2函数作声明,只须在max4函数中作声明即可。 max4函数执行过程: 第1次调用max2函数得到的函数值是a和b中的大者,把它赋给变量m,第2次调用max2得到m和c中的大者,也就是a,b,c 中的最大者,再把它赋给变量m。第3次调用max2得到m和d中的大者,也就是a,b,c,d中的最大者,再把它赋给变量m。这是一种递推方法, 先求出2个数的大者;再以此为基础求出3个数的大者;再以此为基础求出4个数的大者。m的值一次一次地变化,直到实现最终要求
程序改进(1)可以将max2函数的函数体改为只用一个return语句,返回一个条件表达式的值:intmax2(inta.intb)//定义max2函数(returna>=b?a:b)//返回条件表达式的值,即a和b中的大者(2)在max4函数中,3个调用max2的语句可以用以下一行代替:m=max2(max2(max2(ab).c)d);//把函数调用作为函数参数甚至可以取消变量m,max4函数可写成int max4(int a.int bintc.intd)//对max2的函数声明intmax2(inta,intb):returnmax2(max2(max2(a.b).c).d)先调用max2(a,b)",得到a和b中的大者。再调用"max2(max2(a.b).c)"(其中max2(a,b)为已知)得到a.b.c三者中的大者。最后由max2(max2(max2(a.b).c).d)"求得a.b.c.d四者中的大者
(1) 可以将max2函数的函数体改为只用一个return语句,返回一个条件表达式的值: (2) 在max4函数中,3个调用max2的语句可以用以下一行代替: 甚至可以取消变量m,max4函数可写成 先调用“max2(a,b)”,得到a和b中的大者。再调用“max2(max2(a,b),c)”(其中max2(a,b)为已知),得 到a,b,c三者中的大者。最后由“max2(max2(max2(a,b),c),d)”求得a,b,c,d四者中的大者。 程序改进 int max2(int a,int b) //定义max2函数 {return(a>=b?a:b);} //返回条件表达式的值,即a和b中的大者 m=max2(max2(max2(a,b),c),d); //把函数调用作为函数参数 int max4(int a,int b,int c,int d) { int max2(int a,int b); //对max2的函数声明 return max2(max2(max2(a,b),c),d); }