{
static int i=5;
if(--i)
{
main();
printf("%d ",i);
}
}
該程序的輸出爲0 0 0 0
。主調用主
該程序不應該顯示編譯器錯誤嗎?我在這裏錯過了什麼?
{
static int i=5;
if(--i)
{
main();
printf("%d ",i);
}
}
該程序的輸出爲0 0 0 0
。主調用主
該程序不應該顯示編譯器錯誤嗎?我在這裏錯過了什麼?
首先,我+1你的問題,因爲在我15年的編程,我從來沒有想過遞歸調用main()!
現在關於你的問題,它編譯,因爲main()只是一個函數,就像代碼中的任何其他函數。唯一特別的是鏈接器期望在代碼中看到一個main(),並且調用main()會自動插入到可執行文件中。 (我想你甚至可以使用鏈接器開關來定義不同的啓動函數名稱)。
但除此之外,這是一個正常的功能。
「在我15年的編程中我從來沒有想過遞歸調用main()」,我希望你不會因爲你看到這個而啓動。我已經看到它使用過一次,效果很好:代碼混淆入口用於在僅包含一個分號的程序中分配內存。這也是在C++中明確禁止的。 – Dave
@Dave - 別擔心,我不會。但我確實開始使用goto,因爲所有的標準都表示不這樣做,所以他們實際上指出這個命令是存在的,如果存在,我需要檢查它......並且我發現它在K&R書籍,像資源在一個函數內的釋放(例如異常處理)。 –
main
沒有什麼特別的,這意味着你不能在你的程序中使用它,但它不被推薦,因爲它混淆了你的代碼。 (這可怕的代碼,贏得了大賽這麼難讀的調用它自己的主,它編譯沒有警告:http://research.microsoft.com/en-us/um/people/tball/papers/xmasgift/)
如果你弄不清你的程序的流程,考慮切換main
和printf
#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
}
它是'int main(void)',* not *'void main()'。如果您從一本聲稱是C書的東西中學到了'void main()',請讓我們知道它是哪本書,以便我們警告人們遠離它。 (是的,'void main()'在一些有限的情況下可以是有效的,但是「這是錯誤的」對於大多數目的來說足夠接近。) –
考慮到我們遞歸調用'main'風格已經有點不在窗口了。在原始代碼中,沒有返回值。但我會編輯我的反應。我同意這是不正確的,有時會導致失敗。這裏有一些關於'void main(void)'的信息:http://c-faq.com/ansi/voidmain.html – DrRobotNinja
不,不管你是否遞歸地調用'main',一個帶有void main()的程序有*未定義的行爲,除非當前的實現明確允許它。除非您正在爲特別需要它的嵌入式系統編程,否則沒有充分的理由使用'void main()'。在回答中保留原始幾乎肯定不正確的代碼沒有意義。 –
這不僅僅是基本的遞歸...? – CookieOfFortune
C++禁止調用main。 C允許它。請注意,在完成任何打印之前,'i'已經一直迭代到0。也許這就是你的困惑。 – Dave
這是一個代碼片段,而不是一個程序。如果你添加了'#include'和'int main(void)',它將會是一個程序。 –