這個程序的行爲,階乘程序的靜態INT
fact(static int n)
{
int f=1;
if(n<=1) return 1;
else
{
f=n*fact(n-1);
return f;
}
}
如何函數調用和返回值取決於n和爲什麼最終輸出是1
這個程序的行爲,階乘程序的靜態INT
fact(static int n)
{
int f=1;
if(n<=1) return 1;
else
{
f=n*fact(n-1);
return f;
}
}
如何函數調用和返回值取決於n和爲什麼最終輸出是1
某些嵌入式C編譯器支持將static
作爲參數說明符作爲非標準擴展。對於這些編譯器,static
意味着全局分配的參數(通常,這是爲了節省堆棧空間,在嵌入式平臺上可能非常有限)。
在這種情況下,static
參數的存在意味着函數不可重入(不能安全遞歸)。全球分配的n
只會在每個呼叫中更改,直到最後呼叫fact(1)
;當遞歸展開時,每個返回的調用將乘以n
(現在等於1)到結果中,所以最終效果是一串1被相乘以產生最終結果。
存儲類型修飾符(除register
)不允許在函數參數聲明中。你的程序不是有效的C程序。
爲了使其有效,變化:
fact(static int n)
到
int fact(int n)
需要注意的是MPLAB C18編譯器允許static
說明符函數參數視爲一個編譯器擴展。從MPLAB C18 user guide:
2.3.2靜態函數參數
函數參數的存儲類別可以自動或靜態。置於軟件堆棧上的自動參數爲 ,可實現重入。一個靜態參數被全局分配,允許直接訪問通常較小的代碼。僅當編譯器以非擴展模式運行時,靜態參數纔有效(請參見第1.2.5節「選擇模式」)。
如果這是嵌入的C代碼,'static'表示該參數是全局分配的;因此,該功能不可重入(不能安全遞歸)。 – nneonneo
您必須在兩種情況下都返回f,但遞歸調用該函數後,您最終返回1,因此最終輸出爲1。 – Nagaraju