在递归函数调用期间添加 return 关键字与不添加 return 关键字有什么区别?


int main ()
{ 
static int i = 5;
if (--i)
{
return main();
}
printf("%d", i); 
return 0;
}

输出: 0

int main()
{
static int i = 5;
if (--i)
{
main();
}
printf("%d", i);
return 0;
}

输出:

0 0 0 0 0
int main()
{
static int i = 5;
if (--i)
{
main();
printf("%d", i); 
}
return 0;
}

输出: 0 0 0 0

为什么返回关键字会导致这种行为?为什么片段 3 会产生不同的输出? 请详细解释。

在带有return的版本中,当程序启动时i被初始化为5。它将i递减为4。这是非零的,因此输入if块。

它执行return main().这会递归地调用main,当它返回时,我们退出程序(从不执行printf()调用(。

在对main()的递归调用中,我们将i递减为3。这也是非零的,因此输入if块。

它执行return main()。这会递归地调用main,当它返回时,我们从这个调用返回,同样不执行printf()调用。

i递减为21时,也会发生同样的事情,所以我不会描述它们。

最后,我们输入main()i1.我们将其递减为0.这是0,所以没有输入if块。我们继续函数的其余部分并执行printf("%d", i);,它打印0。然后函数返回。

然后,每个先前的递归调用也会返回,因此不会打印任何其他内容。

在没有return的版本中,一切都是一样的,只是函数在递归调用返回后不会立即返回。他们继续printf()声明。但是这些都发生在所有递归调用发生之后,所以i == 0当它们中的每一个调用printf()时,你会得到 5 个 0。

在第三个版本中,printf()调用位于if块内。它类似于第二个版本,但它0仅在--i != 0.因此,它会在每次递归调用后打印0,但不在最终调用中打印,因为该调用跳过if块。因此,它的打印时间比第二个版本少0一次。

相关内容

最新更新