2013-07-22 83 views
0
#include<stdio.h> 
main() 
{ 
    static int i=1; 
    printf("\nSoftware");                 
    for(;i<5;i++) 
     main(); 
    return 0; 
} 

輸出結果是一個無限循環。請解釋。解釋c程序的輸出

+1

當遞歸調用一個函數,你必須具備一定的終止條件,以及每個呼叫必須做出朝向終止條件取得了一些進展,否則你只會永遠循環(或者直到你用完堆棧空間並崩潰)。這裏main()調用發生在i ++之前,所以沒有進展。 –

+0

@AyeshaGupta ...再次閱讀'for'循環...這是非常簡單的問題... – someone

+0

@Ayesha:看到我的回答 –

回答

3

您正在調用功能從您的功能。在您調用新的主要功能後,它會打印一些字符串,然後再次調用主要的函數。

您的i變量根本不會遞增,因爲它在for循環的第一次迭代中不會遞增。在您致電主要之後,它將永遠不會返回到之前的主循環,以便發生for循環的下一次迭代。所以循環將是無限的,並且i將等於。即使您將for循環更改爲任何其他循環,循環仍然是無限的。

我包括你的維修代碼,只是爲了好玩:

#include<stdio.h> 

int main() 
{ 
    static int i=0; 
    if(i>=5) return 0; 
    i++; 
    printf("\nSoftware %i", i); 
    main(); 
    return 0; 
} 
+0

首先要注意的是'i'沒有遞增,所以+ 1。但是,這不是一個無限循環。這是一個無限遞歸(當然會在某個時候崩潰):-) –

+0

但是爲什麼它不會增加? –

+0

@AyeshaGupta因爲要遞增,main()必須返回到循環。這不會發生,所以也不會發生增量。這是因爲for循環只有在第一次迭代完成後才執行'i ++'。在這種情況下它永遠不會完成。 –

0

代碼調用主要功能,一次又一次

for(;i<5;i++) 
main(); 
+0

bt該變量在本質上是靜態的。 –

+0

靜態,但對於每次調用它都會再次創建。 – user2605046

+0

它不會爲每個調用重新創建,它只是不增加,請參閱我的代碼示例:)它增加並保持其值。 – nio

0

它的一種遞歸調用。你的主要功能是調用自己導致無限循環。

0

我< 5調用的main()
我< 5調用的main()
我< 5調用的main()
...

如果妳想要調用一些功能的5倍。

包括

void myFunc() 
{ 
    printf("\nSoftware"); 
} 

main() 
{ 
    static int i=1;                 
    for(;i<5;i++) 
     myFunc(); 
    return 0; 
} 

林用C++所以它可能是一些小錯誤。

1

這不是一個無限循環。

您正在遞歸調用main,但從來沒有結束它。這會導致堆棧溢出。

i++永遠不會被評估,因爲您永遠不會達到for循環的範圍的結束。

1

這似乎沒有任何困難或不同。在這個程序中for循環並不重要,所以每當main()被調用時它都是相同的,它肯定是一個無限循環。使用條件語句可以限制無限循環。此外,這個靜態int並不重要。所以顯然主要被稱爲無限次,直到超時發生。 這實際上是自我解釋的

1

調用循環中的main函數會耗盡所有內存並導致堆棧溢出。

1

是的,輸出結果是無限的,因爲在for(;i<5;i++)i的增量只出現在for循環的最後一行。所以,這裏i的值永遠不會增加。 例如:

for(i=0;i<5;i++) 
{ 
int a,b; // just an example 
a=10; 
b=20; 
printf("%d",i); 
printf("%d %d",a,b); 
// increment of i takes place here at the last line of for loop 
} 

同在這裏也:

main() 
{ 
    static int i=1; 
    printf("\nSoftware");                 
    for(;i<5;i++) 
    {  
    main(); 
    // increment of i takes place here.But compiler never comes at this line .That's why i never incremented . 
    } 
    return 0; 
}