函數>函數的嵌套使用


函數的嵌套使用

函數的嵌套使用

  C語言中不允許作嵌套的函數定義。因此各函數之間是平行的,不存在上一級函數和下一級函數的問題。但是C語言允許在一個函數的定義中出現對另一個函數的使用。這樣就出現了函數的嵌套使用。即在被調函數中又使用其他函數。這與其他語言的副程式嵌套的情形是類似的。其關係可表示如圖。

圖表示了兩層嵌套的情形。其執行過程是:執行main函數中使用a函數的語句時,即轉去執行a函數,在a函數中使用b 函數時,又轉去執行b函數,b函數執行完畢返回a函數的中斷點繼續執行,a函數執行完畢返回main函數的中斷點繼續執行。

【例】計算s=22!+32!

  本題可編寫兩個函數,一個是用來計算平方值的函數f1,另一個是用來計算階乘值的函數f2。主函數先以函數 f1計算出平方值,再在 f1中以平方值為傳入參數,使用 f2計算其階乘值,然後返回f1,再返回主函數,在迴圈程式中計算累加和。

 

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);

}

 

  在程式中,函數 f1f2 均為長整數,都在主函數之前定義,故不必再在主函數中對 f1f2加以說明。在主程序中,執行迴圈程式依次把 i 值作為傳入參數使用函數 f1i2值。在 f1中又發生對函數f2的使用,這時是把i2的值作為傳入參數去調f2,在 f2 中完成求 i2! 的計算。f2執行完畢把C即  i2! 返回給 f1,再由 f1返回主函數作累加。至此,由函數的嵌套使用實現了題目的要求。由於數值很大,所以函數和一些變數的類型都說明為長整型,否則會造成計算錯誤。