下面的代码递归调用 main 并以相反的顺序打印输入的字符。我不明白过去的字符是如何存储在变量 c 中的。当新的输入为什么不覆盖存储在 c 中的过去值?
int main(void)
{
char c;
c=getchar();
if (c!=EOF)
{
main();
printf("%c",c);
}
return 0;
}
下面的代码递归调用 main 并以相反的顺序打印输入的字符。我不明白过去的字符是如何存储在变量 c 中的。当新的输入为什么不覆盖存储在 c 中的过去值?
int main(void)
{
char c;
c=getchar();
if (c!=EOF)
{
main();
printf("%c",c);
}
return 0;
}
关键是该函数是递归调用的。
如您所见,变量 c 是在函数中定义的,因此在函数的每次调用中,都会在堆栈上定义一个新变量 c。
因此,如果您在“hello”中读取,“h”将存储在堆栈上 c 的第一个实例中,然后调用 main,因为“hello”中有另一个字符,因此“e”将存储在第二个实例中堆栈上的 c。这一直持续到读取完整的“你好”。
递归的概念是,维护了一个堆栈,其中存储了每个级别中使用的值。因此,值 c 每次都被压入堆栈,并在从递归深度返回时弹出
如果一个变量像 c 一样是局部变量,它存储在堆栈中,因此每次调用 main 时,您都会得到一个 c 的新副本,然后使用 getchar 设置该副本。
当到达文件末尾时,函数返回,之前的 main 调用继续并打印该值。然后该调用返回并打印前一个字符,直到顶层退出。
这是“abc”的示例,破折号显示堆栈级别
main called c set to "a"
-main called c set to "b"
--main called c set to "c"
---eof
---return
--print "c"
--return
-print "b"
-return
print "a"
return