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 0int 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
递减为2
和1
时,也会发生同样的事情,所以我不会描述它们。
最后,我们输入main()
当i
1
.我们将其递减为0
.这是0
,所以没有输入if
块。我们继续函数的其余部分并执行printf("%d", i);
,它打印0
。然后函数返回。
然后,每个先前的递归调用也会返回,因此不会打印任何其他内容。
在没有return
的版本中,一切都是一样的,只是函数在递归调用返回后不会立即返回。他们继续printf()
声明。但是这些都发生在所有递归调用发生之后,所以i == 0
当它们中的每一个调用printf()
时,你会得到 5 个 0。
在第三个版本中,printf()
调用位于if
块内。它类似于第二个版本,但它0
仅在--i != 0
.因此,它会在每次递归调用后打印0
,但不在最终调用中打印,因为该调用跳过if
块。因此,它的打印时间比第二个版本少0
一次。