8 函數(shù)嵌套調(diào)用
我們學(xué)習(xí)了函數(shù)的定義和使用,那么,函數(shù)在被調(diào)用之前,必須先進(jìn)行定義或者聲明。
如下是一個程序測試?yán)樱?/p>
程序運(yùn)行結(jié)果如下:

可以看到,在main函數(shù)中調(diào)用了func函數(shù)。就是說:函數(shù)調(diào)用了函數(shù);那么,我們稱為:函數(shù)嵌套調(diào)用。
注意:不能夠在函數(shù)中定義函數(shù),就是不能夠“嵌套定義函數(shù)”。我們不可以把func函數(shù)的定義放在main函數(shù)的定義中。例如:
int main(int argc, char* argv[])
{
//定義func函數(shù)
void func(int a)
{
printf("in func, a = %dn", a);
}
func(6);
return 0;
}
注意:這樣的代碼,在VC編譯器,或者Visual Studio編譯器中,是非法定義的代碼。
這樣的代碼是錯誤的,雖然在func函數(shù)的調(diào)用之前,定義了func函數(shù)。但是,不能夠在main函數(shù)中定義func函數(shù),就是不能夠嵌套定義函數(shù)。
但是,在Ubuntu系統(tǒng)的GCC編譯器中,支持嵌套定義函數(shù)的語法。
雖然GCC支持這樣的語法,但是,我們不建議嵌套定義函數(shù)。這樣的語法,是不提倡的寫法。不便于代碼的移植。
但是,函數(shù)可以嵌套調(diào)用,就是在函數(shù)的定義中,調(diào)用其他函數(shù),程序測試?yán)尤缦拢?/p>
注意:下面的例子,作者舉例有些復(fù)雜,在分析的過程中,還分析函數(shù)的返回值等數(shù)據(jù)的傳遞。如果只是說明函數(shù)的嵌套調(diào)用,那么,沒有那么復(fù)雜。很簡單,就是:在一個函數(shù)中,調(diào)用一個函數(shù),這就是函數(shù)的嵌套調(diào)用。
下一章節(jié),我們講解函數(shù)的遞歸調(diào)用,才是重點(diǎn)。

程序運(yùn)行結(jié)果如下:

我們來分析該程序的執(zhí)行過程如下:
(1) 定義了main函數(shù),是程序的入口地址;程序從main函數(shù)開始執(zhí)行;
(2) 在main函數(shù)中調(diào)用func3函數(shù),執(zhí)行到 int x = func3(); 代碼的時候,就跳轉(zhuǎn)到func3函數(shù)執(zhí)行;
(3) 在func3函數(shù)中調(diào)用func2函數(shù),執(zhí)行到 int c = func2(); 代碼的時候,就跳轉(zhuǎn)到func2函數(shù)執(zhí)行;
(4) 在func2函數(shù)中調(diào)用func1函數(shù),執(zhí)行到int b = func1(); 代碼的時候,就跳轉(zhuǎn)到func1函數(shù)執(zhí)行;
(5) 此時,一步一步嵌套調(diào)用函數(shù),調(diào)用到func1函數(shù),執(zhí)行func1函數(shù)體定義的代碼,執(zhí)行:
printf("in func1, a = %dn", a);
輸出調(diào)試代碼,然后,執(zhí)行return a; 返回變量a的值;
(6) 結(jié)束func1函數(shù)的調(diào)用,返回到func2函數(shù)的int b = func1(); 代碼,此時,把func1函數(shù)的返回值賦給變量b,那么,變量b得到func1函數(shù)的返回值10。
(7) 繼續(xù)執(zhí)行func2函數(shù)的代碼:
printf("in func2, b = %dn", b);
return b;
此時,在func2函數(shù)中輸出信息,然后,返回變量b的值;
(8) 結(jié)束func2函數(shù)的調(diào)用,返回到func3函數(shù)的int c = func2(); 代碼,此時,把func2函數(shù)的返回值賦給變量c,那么,變量c得到func2函數(shù)的返回值12。
(9) 繼續(xù)執(zhí)行func3函數(shù)的代碼:
printf("in func3, c = %dn", c);
return c;
輸出調(diào)試信息,然后,返回變量c的值。最終,結(jié)束func3函數(shù)的調(diào)用,返回到main函數(shù)的int x = func3(); 代碼,此時,結(jié)束func3函數(shù)的調(diào)用,把返回值賦給變量x。在main函數(shù)中輸出變量x的值。執(zhí)行完main函數(shù)之后,結(jié)束程序的運(yùn)行。
通過這個程序的分析,我們知道了函數(shù)的嵌套調(diào)用,就是在函數(shù)中調(diào)用函數(shù)。碰到調(diào)用函數(shù)時,就跳轉(zhuǎn)到函數(shù)定義的函數(shù)體中運(yùn)行。例如,在main函數(shù)中調(diào)用func3函數(shù)的時候,就跳轉(zhuǎn)到func3函數(shù)定義函數(shù)體中運(yùn)行。