2013-08-29 18 views
1
{ 
static int i=5; 
if(--i) 
    { 
    main(); 
    printf("%d ",i); 
    } 
} 

該程序的輸出爲0 0 0 0主調用主

該程序不應該顯示編譯器錯誤嗎?我在這裏錯過了什麼?

+0

這不僅僅是基本的遞歸...? – CookieOfFortune

+4

C++禁止調用main。 C允許它。請注意,在完成任何打印之前,'i'已經一直迭代到0。也許這就是你的困惑。 – Dave

+1

這是一個代碼片段,而不是一個程序。如果你添加了'#include '和'int main(void)',它將會是一個程序。 –

回答

0

首先,我+1你的問題,因爲在我15年的編程,我從來沒有想過遞歸調用main()!

現在關於你的問題,它編譯,因爲main()只是一個函數,就像代碼中的任何其他函數。唯一特別的是鏈接器期望在代碼中看到一個main(),並且調用main()會自動插入到可執行文件中。 (我想你甚至可以使用鏈接器開關來定義不同的啓動函數名稱)。

但除此之外,這是一個正常的功能。

+0

「在我15年的編程中我從來沒有想過遞歸調用main()」,我希望你不會因爲你看到這個而啓動。我已經看到它使用過一次,效果很好:代碼混淆入口用於在僅包含一個分號的程序中分配內存。這也是在C++中明確禁止的。 – Dave

+0

@Dave - 別擔心,我不會。但我確實開始使用goto,因爲所有的標準都表示不這樣做,所以他們實際上指出這個命令是存在的,如果存在,我需要檢查它......並且我發現它在K&R書籍,像資源在一個函數內的釋放(例如異常處理)。 –

0

main沒有什麼特別的,這意味着你不能在你的程序中使用它,但它不被推薦,因爲它混淆了你的代碼。 (這可怕的代碼,贏得了大賽這麼難讀的調用它自己的主,它編譯沒有警告:http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/

如果你弄不清你的程序的流程,考慮切換mainprintf

#include <stdio.h> 
void main() 
{ 
    static int i=5; 
    if(--i) 
    { 
    printf("%d ",i); 
    main(); 
    }  
} 

輸出爲4 3 2 1

編輯:此代碼正確使用int main(void)

#include <stdio.h> 
int main(void) 
{ 
    static int i=5; 
    if(--i) 
    { 
    printf("%d ",i); 
    main(); 
    } 

    return 0  
} 
+1

它是'int main(void)',* not *'void main()'。如果您從一本聲稱是C書的東西中學到了'void main()',請讓我們知道它是哪本書,以便我們警告人們遠離它。 (是的,'void main()'在一些有限的情況下可以是有效的,但是「這是錯誤的」對於大多數目的來說足夠接近。) –

+0

考慮到我們遞歸調用'main'風格已經有點不在窗口了。在原始代碼中,沒有返回值。但我會編輯我的反應。我同意這是不正確的,有時會導致失敗。這裏有一些關於'void main(void)'的信息:http://c-faq.com/ansi/voidmain.html – DrRobotNinja

+0

不,不管你是否遞歸地調用'main',一個帶有void main()的程序有*未定義的行爲,除非當前的實現明確允許它。除非您正在爲特別需要它的嵌入式系統編程,否則沒有充分的理由使用'void main()'。在回答中保留原始幾乎肯定不正確的代碼沒有意義。 –