我们学习了函数的定义和使用,那么,函数在被调用之前,必须先进行定义或者声明。
如下是一个程序测试例子:
程序运行结果如下:
可以看到,在main函数中调用了func函数。就是说:函数调用了函数;那么,我们称为:函数嵌套调用。
注意:不能够在函数中定义函数,就是不能够“嵌套定义函数”。我们不可以把func函数的定义放在main函数的定义中。例如:
int main(int argc, char* argv[])
{
//定义func函数
void func(int a)
{
printf("in func, a = %dn", a);
}
func(6);
return 0;
}
注意:这样的代码,在VC编译器,或者Visual Studio编译器中,是非法定义的代码。
这样的代码是错误的,虽然在func函数的调用之前,定义了func函数。但是,不能够在main函数中定义func函数,就是不能够嵌套定义函数。
但是,在Ubuntu系统的GCC编译器中,支持嵌套定义函数的语法。
虽然GCC支持这样的语法,但是,我们不建议嵌套定义函数。这样的语法,是不提倡的写法。不便于代码的移植。
但是,函数可以嵌套调用,就是在函数的定义中,调用其他函数,程序测试例子如下:
注意:下面的例子,作者举例有些复杂,在分析的过程中,还分析函数的返回值等数据的传递。如果只是说明函数的嵌套调用,那么,没有那么复杂。很简单,就是:在一个函数中,调用一个函数,这就是函数的嵌套调用。
下一章节,我们讲解函数的递归调用,才是重点。
程序运行结果如下:
我们来分析该程序的执行过程如下:
(1) 定义了main函数,是程序的入口地址;程序从main函数开始执行;
(2) 在main函数中调用func3函数,执行到 int x = func3(); 代码的时候,就跳转到func3函数执行;
(3) 在func3函数中调用func2函数,执行到 int c = func2(); 代码的时候,就跳转到func2函数执行;
(4) 在func2函数中调用func1函数,执行到int b = func1(); 代码的时候,就跳转到func1函数执行;
(5) 此时,一步一步嵌套调用函数,调用到func1函数,执行func1函数体定义的代码,执行:
printf("in func1, a = %dn", a);
输出调试代码,然后,执行return a; 返回变量a的值;
(6) 结束func1函数的调用,返回到func2函数的int b = func1(); 代码,此时,把func1函数的返回值赋给变量b,那么,变量b得到func1函数的返回值10。
(7) 继续执行func2函数的代码:
printf("in func2, b = %dn", b);
return b;
此时,在func2函数中输出信息,然后,返回变量b的值;
(8) 结束func2函数的调用,返回到func3函数的int c = func2(); 代码,此时,把func2函数的返回值赋给变量c,那么,变量c得到func2函数的返回值12。
(9) 继续执行func3函数的代码:
printf("in func3, c = %dn", c);
return c;
输出调试信息,然后,返回变量c的值。最终,结束func3函数的调用,返回到main函数的int x = func3(); 代码,此时,结束func3函数的调用,把返回值赋给变量x。在main函数中输出变量x的值。执行完main函数之后,结束程序的运行。
通过这个程序的分析,我们知道了函数的嵌套调用,就是在函数中调用函数。碰到调用函数时,就跳转到函数定义的函数体中运行。例如,在main函数中调用func3函数的时候,就跳转到func3函数定义函数体中运行。