6.3.4 嵌套调用
嵌套调用是指在被调函数的函数体中又调用了其他函数的形式。这与其他高级语言的子程序嵌套的情形是类似的。在C51语言中,不允许在嵌套调用中定义其他函数,但是允许调用其他的函数。因为除了主函数外,各个函数的作用范围都是平行的。嵌套调用的程序示例如下。
void Fun1()//定义函数Fun1
{
……
Fun2();//调用函数Fun2
……
}
void Fun2()//定义函数Fun2
{
……
}
void main()//主函数
{
……
Fun1();//调用函数Fun1
……
}
在本例中,程序从main函数开始执行,当遇到调用Fun1函数的语句时,即转去执行Fun1函数。执行Fun1函数时又执行调用Fun2函数的语句,因此又转去执行Fun2函数。Fun2函数执行完毕后,返回Fun1函数的断点处继续执行。Fun1函数执行完毕后,返回main主函数的断点处继续执行后续的程序。
下面以计算s=(3×2)2+(4×2)2的值为例,介绍函数的嵌套调用方法。根据该数学表达式,可以编写两个函数,一个是用来计算平方值的函数square,另一个是用来计算与2的乘积的函数product。主函数先调用函数product计算出乘积,然后在函数square中计算平方值,最后返回主函数。程序示例如下。
include<stdio.h>//头文件
int square(int k)//声明平方函数
int product(int n)//声明乘积函数
void main()//主函数
{
int i=3,j=4;
int d;
d=product(i);//调用函数
d+=product(j);//调用函数
printf(“%d\n”,d);//输出结果
}
int product(int n)//定义函数
{
int k,m;
k=n*2;//计算乘积
m=square(k);//调用square()函数
return m;//返回数值
}
int square(int k)//定义平方函数
{
int a;
a=k*k;//计算平方
return a;//返回数值
}
该程序可以在KeilµVision3编译环境中执行,运行的结果如下。
100
在本例中,主函数之前,先声明了函数square和函数product,均为整型。在主函数中,调用函数product求值。在函数product中计算乘积后又调用函数square,在square中完成最后的计算。函数square执行完毕把结果返回给函数product,再由函数product返回主函数完成计算结果。