我找到了一些有趣的代码行:
#include <stdio.h>
int main()
{
printf("Hi there");
return main();
}
由于对main()
的递归调用,它编译好(VS2013)并最终出现stackoverflow错误。我不知道return
语句接受任何可以评估为预期返回数据类型的参数,在本例中甚至是int main()
。
标准C或Microsoft-ish行为?
答案 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;