【问题标题】:is return main(); a valid syntax?是返回主();有效的语法?
【发布时间】:2015-06-16 11:09:11
【问题描述】:

我发现了一些有趣的代码行:

#include <stdio.h>

int main()
{
    printf("Hi there");
    return main();
}

它编译正常(VS2013)并由于对main() 的递归调用而导致堆栈溢出错误。我不知道return 语句接受任何可以评估为预期返回数据类型的参数,在这个例子中甚至是int main()

标准 C 或类似微软的行为?

【问题讨论】:

  • 阅读函数。提示:main() 是一个函数。
  • 这个例子让你印象深刻的是什么?这只是一个常规的递归调用。
  • @FilipeGonçalves - 也许是因为它是你能写的最简单的递归调用?
  • 在大多数情况下遇到递归,这只是愚蠢的过度设计,通常是不好的做法。这个例子只会吃掉所有的堆栈,然后崩溃和烧毁。确实令人印象深刻。

标签: c main


【解决方案1】:

我不知道return语句接受任何可以评估为预期返回数据类型的参数,

嗯,return 语句可以有一个表达式。

引用C11 标准,第 6.8.6.4 章,return 声明

如果执行带有表达式的return 语句,则表达式的值作为函数调用表达式的值返回给调用者。

所以,对于return main();main(); 函数调用是表达式

关于return main(); 的行为,它的行为类似于正常的递归函数,在这种情况下是无限递归。

标准的C 还是微软式的行为?

只要考虑到C 标准,它不会对递归调用main() 施加任何限制

但是,FWIW,AFAIK,在C++,这是不允许的。

【讨论】:

    【解决方案2】:

    在 C 中,main 可以像任何其他函数一样被调用,例如在程序中的 return 语句中。

    可以像其他函数一样递归调用main,没有特殊限制:

    (C11, 6.5.2.2p11) “应允许递归函数调用,直接或间接通过任何其他函数链。”

    在C++中,不允许调用main,所以不能在return语句中调用函数。

    (C++11, 3.6.1p3) "main函数不能在程序中使用"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2013-04-20
      • 2017-04-13
      相关资源
      最近更新 更多