我在使用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
在编译时。这意味着,每次调用该函数时,它将not重置为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));
}
EDIT:我将尝试添加一些澄清!考虑一条声明,该声明在“全局”范围内(即,不在任何函数内,甚至不在main
中)声明并初始化静态变量:
static int StatInt1 = 42;
[当编译器遇到此语句时,它将为程序“分配”一部分内存,其大小足以容纳int
,并为该内存分配代表42
的值。编译器不生成任何机器码指令,用于将给定的值移入该内存;实际上,它cannot不可能生成这样的代码-因为没有“上下文”可在其中运行该代码。
但是,如果您稍后(在函数中的某个位置或在main
中,则具有这样的语句:
StatInt1 = 9;
然后编译器将生成代码,该代码将值9
的表示移动到先前为变量“分配”的内存中。确切的说,这些代码将取决于编译器和目标计算机,但是我们可以说它是一条指令MOVE 9 TO @StatInt1
(其中@ StatInt1是“已分配”存储块的地址)。
现在,如果要将static int StatInt1 = 42;
语句移到函数主体中(非常像您所拥有的那样),那么(根据定义)此操作不会改变编译器解释该语句的方式!它所做的就是访问该函数的变量“ local”。 仍然没有生成将值移入变量的代码!
但是声明为静态的not函数内部的变量的处理方式非常不同-我们有时将此类变量称为“自动”!仅在实际调用函数时才“分配”此类变量的存储块,然后将为其分配调用函数的初始化器[[每次]]中给定的值。 (通常,大多数编译器会在堆栈上创建内存:函数结束时会“擦除”的短期内存。)在您的代码中, 明确地static int r = 5;
不会生成任何代码,因此在调用函数时不会自动对5
值进行重新分配。因此,一旦以将值50
分配给r
的方式调用了函数,它将一直保留该值,直到您