函數(shù)的嵌套調(diào)用
C語(yǔ)言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平行的,不存在上一級(jí)函數(shù)和下一級(jí)函數(shù)的問題。 但是C語(yǔ)言允許在一個(gè)函數(shù)的定義中出現(xiàn)對(duì)另一個(gè)函數(shù)的調(diào)用。 這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。 這與其它語(yǔ)言的子程序嵌套的情形是類似的。其關(guān)系可表示如圖5.2。
圖5.2表示了兩層嵌套的情形。其執(zhí)行過程是:執(zhí)行main函數(shù)中調(diào)用a函數(shù)的語(yǔ)句時(shí),即轉(zhuǎn)去執(zhí)行a函數(shù),在a函數(shù)中調(diào)用b 函數(shù)時(shí),又轉(zhuǎn)去執(zhí)行b函數(shù),b函數(shù)執(zhí)行完畢返回a函數(shù)的斷點(diǎn)繼續(xù)執(zhí)行,a 函數(shù)執(zhí)行完畢返回main函數(shù)的斷點(diǎn)繼續(xù)執(zhí)行。
[例5.8]計(jì)算s=22!+32!
本題可編寫兩個(gè)函數(shù),一個(gè)是用來(lái)計(jì)算平方值的函數(shù)f1, 另一個(gè)是用來(lái)計(jì)算階乘值的函數(shù)f2。主函數(shù)先調(diào)f1計(jì)算出平方值, 再在f1中以平方值為實(shí)參,調(diào)用 f2計(jì)算其階乘值,然后返回f1,再返回主函數(shù),在循環(huán)程序中計(jì)算累加和。
long f1(int p)
{
int k;
long r;
long f2(int);
k=p*p;
r=f2(k);
return r;
}
long f2(int q)
{
long c=1;
int i;
for(i=1;i<=q;i++)
c=c*i;
return c;
}
main()
{
int i;
long s=0;
for (i=2;i<=3;i++)
s=s+f1(i);
printf("\ns=%ld\n",s);
}
long f1(int p)
{
……
long f2(int);
r=f2(k);
……
}
long f2(int q)
{
……
}
main()
{ ……
s=s+f1(i);
……
}
在程序中,函數(shù)f1和f2均為長(zhǎng)整型,都在主函數(shù)之前定義, 故不必再在主函數(shù)中對(duì)f1和f2加以說(shuō)明。在主程序中, 執(zhí)行循環(huán)程序依次把i值作為實(shí)參調(diào)用函數(shù)f1求i2值。在f1中又發(fā)生對(duì)函數(shù)f2的調(diào)用,這時(shí)是把i2的值作為實(shí)參去調(diào)f2,在f2 中完成求i2! 的計(jì)算。f2執(zhí)行完畢把C值(即i2!)返回給f1,再由f1 返回主函數(shù)實(shí)現(xiàn)累加。至此,由函數(shù)的嵌套調(diào)用實(shí)現(xiàn)了題目的要求。 由于數(shù)值很大, 所以函數(shù)和一些變量的類型都說(shuō)明為長(zhǎng)整型,否則會(huì)造成計(jì)算錯(cuò)誤。
相關(guān)推薦:計(jì)算機(jī)等考二級(jí)C語(yǔ)言備考:C語(yǔ)言/C++編譯過程北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |