代码将不同的变量保持在同一个名称下,而不是覆盖

Posted

技术标签:

【中文标题】代码将不同的变量保持在同一个名称下,而不是覆盖【英文标题】: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 变量? 【参考方案1】:

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

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

static char letter;

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

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

【讨论】:

以上是关于代码将不同的变量保持在同一个名称下,而不是覆盖的主要内容,如果未能解决你的问题,请参考以下文章

如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?

Javascript - 将一个大对象分配(而不是克隆)一个新变量以减少其名称

使用 findOneAndUpdate() 时,如果没有提供值,如何保持字段不变(而不是用 null 覆盖)?

如何在循环内声明一个新变量而不是错误?

用元素名称替换索引,保持名称的顺序而不是索引的顺序

在方案中设置构建变量而不是目标