2013-07-22 67 views
6

任何人都可以向我解釋此程序輸出背後的原因是0 0 0 0 0在遞歸函數的情況下獲得的值

這裏我們使用的是一個static variable var,它們的值由於函數調用而不會改變。在遞歸調用期間,var的值將爲4, 3, 2, 1。當var變爲零時,遞歸終止並且控制移至printf語句。

爲什麼輸出不是1,2,3,4

main(){ 
     static int var=5; 
     if(--var) 
     main(); 
     printf(" %d ",var); 
} 

同樣,如果你使用,如果條件var--則程序輸出將是-1 -1 -1 -1 -1 -1

+0

大約第2個問題:'--var'首先遞減,然後檢查if(var)',而'var - '檢查var的值然後遞減。 if(var - )'表示如果(var)var = var - 1;和'if( - var)':'var = var - 1;如果(var)' – varren

回答

11

在您的遞歸調用printf()main()返回時執行。而且由於varstatic variable其價值仍然0(最終值= 0相同的所有函數調用)

if()條件爲假時var成爲0(最後一個值,之後的main();叫你不要更改VAR - 注意圖)。

希望下面的圖表會幫助你理解(閱讀評論):靜態函數的

main() <---------------+ 
{      | 
    static int var=5; | <----"Declared only one/first time with value 5" 
    if(--var)   | 
---- main(); ---------+ // called if var != 0 
|    // main called for var = 4, 3, 2, 1 
|// recursion stooped  
|// return with 0 value 
|// now no operation applied on `var` so it remain 0 
+--> printf(" %d ",var); // called when return ed 
} 

餘生活,直到程序終止(所以沒有價值損失),及適用範圍是函數內。

14.1.6 Static Variables

靜態自動變量的範圍是相同的 自動變量的,即,它是本地的,其中它被 定義的塊;但是,分配的存儲空間對於程序的持續時間爲永久性的。靜態變量可以在其 聲明中初始化;但是,初始化程序必須是常量表達式, 並且在編譯時僅在爲靜態變量*分配了內存 時纔會初始化一次。

第二個問題:

如果使用var--再然後你的輸出就會-1 -1 -1 -1 -1 -1

假設,如果你的條件將是var--然後if()條件拳頭遞減--之前檢查truefalse。 (因爲在表達var--,--是後綴)。
而且因爲if()中斷var == 0然後遞歸調用停止並函數返回從0-1遞減值。因爲返回var不會改變,因此輸出爲-1

+0

那肯定是吧。在所有遞歸(以及減法)完成後調用printf – MyPasswordIsLasercats

+0

@MyPasswordIsLasercats是檢查圖 –

+0

值得注意的是,這裏關於觀察/預期輸出的真正問題是變量是靜態的,這意味着它是相同的變量跨遞歸調用。具有局部變量和一些修改的修改後的代碼將產生預期的輸出。 – Thomas

2

在遞歸調用期間,var的值將爲4, 3, 2, 1。當變量 變爲零時,遞歸終止並且控制移動到 printf()聲明。爲什麼輸出不是1, 2, 3, 4

靜態變量是一個靜態分配的變量 - 其生存期或「擴展」跨越整個程序運行。

所以var值的每一次變化,最後就變成0printf()的主返回後執行,並作爲var值是0,每printf()語句將打印0

+0

@Grijesh Chauhan謝謝,下次我會照顧它.. –

1

靜態變量是那些變量,其續航時間保持等於program.Static變量的續航時間得到初始化一次。每次系統調用後,變量的值都會更改。如果您沒有將變量聲明爲靜態,則會出現無限遞歸,導致分段錯誤

相關問題