【问题标题】:Code keeps different variables under the same name instead of overwriting代码将不同的变量保持在同一个名称下,而不是覆盖
【发布时间】:2022-01-08 20:40:32
【问题描述】:

我几乎是一个初学者,在学习递归时,我遇到了这段代码:

#include <stdio.h>
void reverseSentence();

int main()
{
    printf("Enter a sentence: ");
    reverseSentence();

    return 0;
}

void reverseSentence()
{
    char letter;
    scanf("%c", &letter);

    if( letter != '\n')
    {
        reverseSentence();
        printf("%c",letter);
    }
}

我不明白的是,不是每次调用函数时都应该更改字母变量吗?我认为它不会因此而起作用,但以某种方式颠倒了一个句子,就像它应该的那样。

【问题讨论】:

  • letter 变量是在函数内部声明的(而不是 static),因此它是每次调用函数的新变量。
  • @Paul Hankin 那么,计算机是否通过调用它们定义的函数来区分letter 变量?

标签: c recursion


【解决方案1】:

这与持续时间和范围有关。这里letter 在块中声明(实际上是在函数中)并且不是静态的。据说它是一个自动变量。函数的每次调用都将获得其自己的变量版本,并且将独立于任何其他调用中的变量。这就是代码产生预期结果的原因。

你想象的将是一个静态持续时间变量:

static char letter;

静态变量在程序启动时获取其地址,其值将在声明它的函数(或块)的任何调用之间共享。

在常见的实现中,静态变量在全局变量段中具有固定地址,而自动变量存在于堆栈中,这解释了函数的递归调用如何为变量具有不同的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-10-31
    • 2014-01-08
    • 2019-08-18
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多