2014-08-27 53 views
2

以下代碼使用Codeblocks將輸出設置爲0 0 0 0。main()的遞歸的不可預知的輸出

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

我完全理解上面的代碼是如何執行的。然而,當我從代碼中刪除'static'並使用int i = 5時,Ideone.com(在線編譯器)給了我運行時錯誤,並且Codeblocks(使用GCC)給我什麼都不給 - 即使終端不彈出。

我也嘗試將聲明部分放在主體之外,即static int i;在主體中,我然後給了我= 5 ;.不過,我收到了上述錯誤。我不知道發生了什麼。任何幫助將不勝感激。

PS:程序在網站上找到,沒有給出解釋。

+2

您可能想要了解什麼是靜態局部變量。例如:http://stackoverflow.com/q/572547/1025391 – moooeeeep 2014-08-27 16:41:05

+1

IIRC'main'函數在C99或C11標準規範中具有非常特殊的地位,不允許被調用(遞歸)。所以這是未定義的行爲。 – 2014-08-27 17:05:08

回答

0

如果您刪除static,則在輸出任何內容之前您將獲得無限遞歸。遞歸導致堆棧溢出,程序崩潰。

static意味着您始終在同一個變量上操作,因此如果您刪除它,您可以從5 - > 0進行計數,每次調用時都會初始化爲5,並且if(4)始終爲真。 與static它只被初始化一次。

+0

當我在main()之外放置聲明'static int i'時,爲什麼我沒有得到輸出? – 2014-08-27 16:45:43

+1

因爲你是'我= 5;'每次都執行。只有當你將它用作初始化時,它纔不會每次重複。 – 2014-08-27 16:49:23

4

如果您刪除每個調用main獲取其自己的i副本的靜態,則初始化爲5,因此遞歸永遠不會終止。

+0

這是可以理解的,但是如果我在main()之外聲明'static int i',會出現什麼問題? – 2014-08-27 16:41:48

+2

@code_dweller你在哪裏指定i = 5?在宣言或主要?如果它是主要的,那麼每次調用main時它將被重新分配5。 – dohashi 2014-08-27 16:49:37

1

當您在main()之外聲明static int i並在main()內將其初始化爲值5執行時有問題。第一次if(4)使它呼叫你的內部main(),它執行外部main()使得i回到5導致它無限循環,因此沒有看到輸出,因爲你的if永遠不會失敗,只有一個可能性是if(4)

int main() // 1st main call 
{ 
    static int i=5; 
    if(--i){ // if(4), if(3), if(2), if(1)-> all four if's are true 
      // if(0) fails 
    main(); // 2nd main, 3rd main, 4th main, 5th main -> corresponding to 
      // above successful if's. 
      // When if(0), recursion ends, return 
    printf("%d ",i); // Now i is `0` and prints 4 zero's 
    } 
} 
0

當使用靜態printf將顯示4,3,2,1和遞歸將結束。理論上(如果程序運行)printf將顯示4,4,4,4 .. ,並且遞歸永遠不會結束。如果不使用靜態,理論上(如果程序運行),printf將顯示4,4,4,4 .. ,並且遞歸永遠不會結束。

0

你的代碼沒有問題。 CASE 1: 如果你寫,它會給你輸出0000,因爲你正在遞減i值。一旦它變爲0.如果條件將是錯誤的並且它將打印0四次。

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

案例2:

,但如果去掉靜態的,在每一個遞歸調用您要創建一個新的變量i將採取每次2字節和消耗內存(堆棧)。一旦堆棧滿了,它會提示運行時錯誤,程序將崩潰。在線編譯器http://ideone.com 在後端處理運行時錯誤,以便程序不會崩潰。這就是爲什麼你會遇到運行時錯誤。和預期的答案。

案例3:

而當你以外的聲明變量像

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

在這種情況下,它會再次越過內存限制。這裏每次你給5賦i和main()都會佔用堆棧空間,再次造成程序崩潰。