0

下面的代码递归调用 main 并以相反的顺序打印输入的字符。我不明白过去的字符是如何存储在变量 c 中的。当新的输入为什么不覆盖存储在 c 中的过去值?

int main(void) 
{
    char c;
    c=getchar();

    if (c!=EOF)
    {
        main();

        printf("%c",c); 
    }

    return 0;
}
4

3 回答 3

1

关键是该函数是递归调用的。

如您所见,变量 c 是在函数中定义的,因此在函数的每次调用中,都会在堆栈上定义一个新变量 c。

因此,如果您在“hello”中读取,“h”将存储在堆栈上 c 的第一个实例中,然后调用 main,因为“hello”中有另一个字符,因此“e”将存储在第二个实例中堆栈上的 c。这一直持续到读取完整的“你好”。

于 2013-04-21T15:47:31.157 回答
1

递归的概念是,维护了一个堆栈,其中存储了每个级别中使用的值。因此,值 c 每次都被压入堆栈,并在从递归深度返回时弹出

于 2013-04-21T15:45:41.030 回答
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
于 2013-04-21T15:45:03.453 回答