下面的代码以递归方式调用main并以相反的顺序打印输入的字符。 我不明白过去的字符是如何存储在变量c中的。当新的一个输入为什么没有过去存储在c中的值被覆盖?
int main(void)
{
char c;
c=getchar();
if (c!=EOF)
{
main();
printf("%c",c);
}
return 0;
}
答案 0 :(得分:1)
如果变量是本地的,就像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
答案 1 :(得分:1)
递归的概念是,维护堆栈,其中存储每个级别中的使用值。因此,每次将值c推入堆栈,并在从递归深度返回时弹出
答案 2 :(得分:1)
关键是该函数是递归调用的。
正如您所看到的,变量c是在函数中定义的,因此在函数的每次调用中,都会在堆栈上定义一个新的变量c。
因此,如果您在“hello”中读取,则“h”将存储在堆栈中的第一个c实例中,然后调用main,因为“hello”中有另一个字符,因此“e”将存储在堆栈上的第二个c实例。这种情况一直持续到阅读完整的“你好”为止。