【问题标题】:Calling main inside of main in c在c中调用main内部的main
【发布时间】:2016-06-15 15:17:09
【问题描述】:

我想问为什么当我有:

int main() {
    printf( "Hello world") ;
    main ;
}

编译器打印“Hello world”, 但是当我使用 main() 而不是 main 时,它会重复打印“Hello world”。

【问题讨论】:

  • @JoulinRouge 那条非常聪明的评论并不能解释使用标识符main 的两种方式之间的区别,这似乎是这里真正的问题.
  • 例如它可能有助于获得以下完全正确的答案:C 允许语句成为纯粹的表达式——被评估但对状态没有任何影响的东西。现代编译器通常会发出警告。
  • @underscore_d 刚刚发布了“你的意思是:递归”的事情。差异已经解释过了。要我删除它吗?
  • @JoulinRouge 我承认我什至不知道谷歌有这个笑话,呵呵。我不介意您是否将其删除;我只是澄清一下,问题似乎是关于差异,而不是“为什么会重复”。

标签: c main


【解决方案1】:
int main() {
    printf( "Hello world") ;
    main ;
}

最后一条语句main ; 几乎没有任何意义:它只是获取函数指示符,将其转换为指向函数的指针,然后将结果丢弃。

int main() {
    printf( "Hello world") ;
    main() ;
}

此代码使用“主递归”。函数main()main() 内部调用。这个递归调用将无限继续,当堆栈耗尽时它可能会在某个地方崩溃,或者如果编译器足够聪明,可以将这个尾递归转换为一个简单的循环,它可能会一直运行到您按 Ctrl+C 或其他方式停止。

【讨论】:

  • 我要补充一点,一个体面的编译器应该对第一种情况发出警告:warning: statement with no effect
  • @LPs:这需要启用警告。初学者倾向于避免一些事情,因为他们“收到了太多令人讨厌的信息”...... :-(( - 老实说,我曾经从一个学生那里得到过这样的解释!
  • @Olaf 难以置信,对吧?当我的程序没有产生警告时,我会庆祝。或者更确切地说,当它生成的唯一警告是由于某些g++ 错误导致的一次误诊...
  • @underscore_d:我简直是无语了。这真的很少发生。更不用说那个学生没有通过课程(因为写垃圾代码和不懂语言,不仅仅是因为那种态度)。
【解决方案2】:

main(); 将递归调用该函数(并最终由于堆栈溢出而崩溃,除非您的编译器已巧妙地将递归优化为循环)。

main 是一个表达式,其值等于函数main()地址。这是一个空操作,但在语法上仍然有效。

(请注意,从自身调用main的行为在C++中是undefined,但在C中是有效的。省略来自main的返回值在C中也是明确定义的:0假定)。

【讨论】:

  • 省略main 的返回值导致0 在C++ 中也被假定,因为它采用了(如各种,但不是all,其他东西)来自C99。我没有意识到他们在main() 中的递归位置不同......无论如何我都不想使用它!
【解决方案3】:

这是因为:

main()

是一个方法调用。您正在递归地反复调用 main 函数。这将一直运行到调用堆栈溢出为止。

main

是一个函数指针,所以你在这一行并没有真正做太多。打印一次“Hello World”后函数退出。

【讨论】:

    【解决方案4】:

    main 是函数指针,而 main() 是函数调用。

    当您编写main 时,它只是一个语句,您不会在任何地方使用或修改它,但 main() 是函数调用,它将是一个递归(在这种情况下是无限的)调用。

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 2016-02-06
      • 2014-03-26
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      相关资源
      最近更新 更多