是返回main();一个有效的语法?

时间:2015-06-16 11:09:12

标签: c main

我找到了一些有趣的代码行:

#include <stdio.h>

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

由于对main()的递归调用,它编译好(VS2013)并最终出现stackoverflow错误。我不知道return语句接受任何可以评估为预期返回数据类型的参数,在本例中甚至是int main()

标准C或Microsoft-ish行为?

2 个答案:

答案 0 :(得分:6)

  

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

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

引用C11标准,第6.8.6.4章, return语句

  

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

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

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

  

标准C或Microsoft-ish行为?

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

然而,C++中的FWIW,AFAIK,是不允许的。

答案 1 :(得分:3)

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

允许递归调用main,因为它与其他函数一样,没有特殊限制:

  

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

在C ++中,不允许调用main,因此无法在return语句中调用该函数。

  

(C ++ 11,3.6.1p3)&#34;函数main不得在程序中使用&#34;