主要呼叫主要

时间:2013-08-29 18:53:09

标签: c

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

此程序的输出为0 0 0 0

这个程序不应该显示编译器错误吗?我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

首先,我给你的问题+1,因为在我15年的编程中,我从未想过递归调用main()!

现在关于你的问题,它编译,因为main()只是一个函数,就像代码中的任何其他函数一样。关于它的唯一特殊之处在于链接器期望在代码中看到main(),并且对main()的调用会自动插入到可执行文件中。 (我认为您甚至可以使用链接器开关来定义不同的启动函数名称。)

但除此之外,这是一个正常的功能。

答案 1 :(得分: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    
}