它如何存储过去的字符?

时间:2013-04-21 15:38:49

标签: c

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

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

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

        printf("%c",c); 
    }

    return 0;
}

3 个答案:

答案 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实例。这种情况一直持续到阅读完整的“你好”为止。