我正在使用尾递归编写阶乘,我在这里有一个问题。我原来的功能是这样的
代码片段A
#include <stdio.h>
int main(void)
{
int n = 0;
printf("Enter number to find factorial of : ");
scanf("%d",&n);
printf("fact == %d\n",fun(n,1));
return 0;
}
int fun(int n, int sofar)
{
int ret = 0;
if(n == 0)
return sofar;
ret = fun(n-1,sofar*n);
return ret;
}
但是,即使我不使用 return,它仍然有效。这并不完全合理,因为我只在基本情况下返回值。假设 n==5,则在基本情况下将返回 120。但是无法预测从第 4 次调用返回到第 3 次调用的内容,因为我们没有明确指定任何返回,这与代码片段 A 不同。
代码片段B
int fun(int n, int sofar)
{
int ret = 0;
if(n == 0)
return sofar;
ret = fun(n-1,sofar*n);
}
我认为上述工作是因为某种编译器优化?因为如果我在代码片段 B 中添加一个 printf 语句,它就不再起作用了。
代码片段C
int fun(int n, int sofar)
{
int ret = 0;
if(n == 0)
return sofar;
ret = fun(n-1,sofar*n);
printf("now it should not work\n");
}
可能是 printf 导致从堆栈中删除某些内容?请帮助我理解这一点。
最佳答案
不从应该返回值的函数返回值是 undefined behavior .
如果运气好的话,那么这不是优化,而只是这些自动分配值的存储方式和存储位置的巧合。
关于c++ - 这是递归上下文中的编译器优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31189662/