c语言 - "static"关键字如何影响计算?



我在这个代码中有一个问题,使用static关键字。在这里,在 n = 3 之后,我以为r的值将是 5,但我发现r的值是 50!我不知道static在这里是如何工作的:

int magic(int n)
{
static int r = 5;
if (n <= 0) return 10;
if (n > 3)
{
r = 50;
return(r + magic(n-1));
}
return(r - magic(n-1));
}
int main()
{
int x;
x = magic(8);
printf("%d",x);
}

此处输出为 290,因为r在所有情况下的值均为 50。请有人帮我解决这个问题。

当你有语句static int r = 5;时,这会向编译器发出信号,表示变量r将在编译时初始化为5的值。这意味着,每次调用函数时都不会重置为5

另外,if (r > 3)行不能按照您的建议工作(请参阅我在问题中的评论(!改成if (n > 3)就照你说的做。

无论如何,以下代码执行一些不同操作(输出 245(,但我不确定您希望输出是什么:

#include <stdio.h>
int magic(int n)
{
int r = 5; // NOT STATIC - so this is reset to 5 at the start of each call!
if (n <= 0) return 10;
else if (n > 3) { // Your "if (r > 3)" means the block will ALWAYS execute!
r = 50;
return(r + magic(n - 1));
}
return(r - magic(n - 1));
}

编辑:我将尝试添加一些澄清!考虑一个语句,该语句在"全局"作用域中声明和初始化静态变量(即,不在任何函数中,甚至在main

(:
static int StatInt1 = 42;

当编译器遇到此语句时,它会为程序"分配"一部分内存,该内存足够大以容纳int,并为该内存块提供表示42的值。编译器不会生成任何机器代码指令来将给定的值移动到该内存中;事实上,它不可能生成这样的代码 - 因为没有运行该代码的"上下文"。

但是,如果您稍后(在函数中的某个地方或main中的某个地方(有这样的语句:

StatInt1 = 9;

然后编译器将生成代码,9的表示形式移动到先前为变量"分配"的内存中。这段代码的具体内容取决于编译器和目标机器,但假设它是一个指令MOVE 9 TO @StatInt1(其中@StatInt1是"分配"内存块的地址(。

现在,如果您要将static int StatInt1 = 42;语句移动到函数的主体中(就像您所做的一样(,这(根据定义(不会改变编译器解释语句的方式!它所做的只是访问该函数的变量"local"。仍然没有生成将值移动到变量中的代码!

但是函数中声明为 static 的变量的处理方式非常不同 - 我们有时将此类变量称为"自动"!这种变量的内存块仅在实际调用函数时被"分配",然后每次调用函数都会被分配初始化器中给出的值。(通常,大多数编译器会在堆栈上创建内存:函数结束时被"清除"的短期内存。

在代码中,static int r = 5;不会生成任何代码,因此在调用函数时5不会"自动"重新分配值。因此,一旦以将值50分配给r的方式调用该函数,它将保留该值,直到您显式地给它另一个值。

如果这是漫无边际的,我深表歉意 - 但我希望它能清楚地(呃(发生了什么!

最新更新