【时时三省】(C语言基础)函数的嵌套调用
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数,
其执行过程是:
①执行main函数的开头部分;
②遇函数调用语句,调用函数a,流程转去a函数;
③执行a函数的开头部分;
④遇函数调用语句,调用函数b,流程转去函数b;
⑤执行b函数,如果再无其他嵌套的函数,则完成b函数的全部操作;
⑥返回到a函数中调用b函数的位置;
⑦继续执行a函数中尚未执行的部分,直到a函数结束;
⑧返回main函数中调用a函数的位置;
⑨继续执行main函数的剩余部分直到结束。
例题
输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。
解题思路:
这个问题并不复杂,完全可以只用一个主函数就可以得到结果。现在根据题目的要求,用函数的嵌套调用来处理。在main函数中调用max4函数,max4函数的作用是找出4个数中的最大者。在max4函数中再调用另一个函数max2。max2函数用来找出两个数中的大者。在max4中通过多次调用max2函数,可以找出4个数中的大者,然后把它作为函数值返回main函数,在main函数中输出结果。以此例来说明函数的嵌套调用的用法。
编写程序:
运行结果:
程序分析:
可以清楚地看到,在主函数中要调用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语句,返回一个条件表达式的值:
int max2 ( int a , int b ) / /定义max2函数
{ return ( a > = b ? a : b );} / /返回条件表达式的值,即a和b中的大者
( 2 )在max4函数中,3个调用max2的语句(如m = max2 ( a,b );)可以用以下一行代替:
m = max2 ( max2 ( max2 ( a,b ),c ),d );/ /把函数调用作为函数参数
甚至可以取消变量m,max4函数可写成
int max4 ( int a , int b , int c , int d )
{ int max2 ( int a , int b );/ /对max2的函数声明
return max2 ( max2 ( inax2 ( 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四者中的大者。