2013-08-03 60 views
-5

這個程序的行爲,階乘程序的靜態INT

fact(static int n) 
{ 
    int f=1; 
    if(n<=1) return 1; 
    else 
    { 
    f=n*fact(n-1); 
    return f; 
    } 
} 

如何函數調用和返回值取決於n和爲什麼最終輸出是1

+0

如果這是嵌入的C代碼,'static'表示該參數是全局分配的;因此,該功能不可重入(不能安全遞歸)。 – nneonneo

+0

您必須在兩種情況下都返回f,但遞歸調用該函數後,您最終返回1,因此最終輸出爲1。 – Nagaraju

回答

2

某些嵌入式C編譯器支持將static作爲參數說明符作爲非標準擴展。對於這些編譯器,static意味着全局分配的參數(通常,這是爲了節省堆棧空間,在嵌入式平臺上可能非常有限)。

在這種情況下,static參數的存在意味着函數不可重入(不能安全遞歸)。全球分配的n只會在每個呼叫中​​更改,直到最後呼叫fact(1);當遞歸展開時,每個返回的調用將乘以n(現在等於1)到結果中,所以最終效果是一串1被相乘以產生最終結果。

2

存儲類型修飾符(除register)不允許在函數參數聲明中。你的程序不是有效的C程序。

爲了使其有效,變化:

fact(static int n) 

int fact(int n) 

需要注意的是MPLAB C18編譯器允許static說明符函數參數視爲一個編譯器擴展。從MPLAB C18 user guide

2.3.2靜態函數參數

函數參數的存儲類別可以自動或靜態。置於軟件堆棧上的自動參數爲 ,可實現重入。一個靜態參數被全局分配,允許直接訪問通常較小的代碼。僅當編譯器以非擴展模式運行時,靜態參數纔有效(請參見第1.2.5節「選擇模式」)。