“ static”关键字如何影响计算?

问题描述 投票:0回答:1

我在使用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。请有人可以帮助我。

c recursion static
1个回答
2
投票

[拥有语句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的方式调用了函数,它将一直保留该值,直到您

明确地

给它另一个值。我对此表示歉意-但我希望这能使事情变得清楚!

© www.soinside.com 2019 - 2024. All rights reserved.