以下内容的输出是什么
int main()
{
printf ("welcome");
main ();
return;
}
选项:
我的分析:我认为方案1是正确的。选项2,3和5绝对不是。我也不认为选项4也是如此。原因,我相信如果主函数使用一些消耗内存的局部变量,可能会发生堆栈溢出。因此,我认为选项1是正确的选择!我同意递归函数会导致堆栈溢出,但这也取决于函数实现的内容。在这种情况下,仅打印printf。请让我知道您对此的反馈。谢谢!
答案 0 :(得分:2)
这取决于实现。该语言没有说明函数调用的实现方式,它们只需要为有效程序产生正确的结果即可。
在大多数实现中,我期望#4。即使您没有局部变量,它仍然需要一个堆栈框架来保存返回位置。
如果您的函数是尾部递归的,并且编译器优化了尾部调用,则可以避免堆栈溢出。为此,该功能必须以以下结尾:
return main();
答案 1 :(得分:2)
显然是compilation error
,因为该函数返回一个整数,而您的返回未返回任何内容。
int
与void
不兼容。
假设您将正确返回,它将是stack overflow
,因为您需要堆叠返回的值-在无限递归调用之后无法在此处应用尾部优化,因此无法在迭代中进行转换
答案 2 :(得分:0)
暂时忽略递归调用main
并不是一个好主意,如果运行此代码,最终将导致堆栈溢出。
即使没有局部变量,堆栈仍需要跟踪函数的返回地址。该返回地址将累加起来,最终使堆栈崩溃。
答案 3 :(得分:0)
由于返回类型int的函数未返回任何值,因此这将是您的第一个编译错误。
还有一种情况是堆栈溢出,因为每次调用main()时,堆栈都会存储要在main之后执行的return语句的地址,在这种情况下您不会发生这种情况,然后函数再次调用自身。
因此,每个调用堆栈之后都会有return语句的地址。