为什么静态变量在每次调用函数时初始化,但我们必须每次在C中声明它

时间:2017-03-02 06:01:57

标签: c recursion static-variables static-memory-allocation

我读到:静态变量只初始化一次(与自动变量不同),静态变量的进一步定义将在运行时被绕过。 from the link

那么为什么我在下面给出的代码中得到“我没有声明”的错误。 我编写的程序使得静态变量“i”在c增加之后第一次初始化时c等于0。 我只是想知道静态变量是如何工作的,这就是为什么我只声明一次静态变量。我的问题是,如果静态变量只在每个函数调用中声明一次,那么为什么我的代码没有运行,如果有必要在每次调用中声明它,那么为什么它不会在每个函数调用中初始化。

#include<stdio.h>

int c=0;

int test()
{
    if(c==0)
       {
           static int i=0;
       }
    c++;
    i++;
    if(i==5)
        printf("%d\n",i);
    else
        test();
}
int main()
{
    test();
    return 0;
}

6 个答案:

答案 0 :(得分:4)

您可以在if的本地范围内定义变量。它外面没有范围static仅处理范围(也称为生命周期)。

使用花括号和缩进。然后你会看到你的错误。

答案 1 :(得分:1)

因为i的范围只是以下代码中的if块:

if(c==0)
    static int i=0;

相同
if(c==0)
{
    static int i=0;
}

iif block

之外无法使用

答案 2 :(得分:0)

如果将static变量放在块或函数内,那么该变量将不再在范围之外可用,因为在{}执行后只有大括号if只有第一个语句。所以它不能在其他任何地方使用,编译器会给出错误。

答案 3 :(得分:0)

要修复编译错误,请在条件之外声明我。并在条件中将其设置为零 -

static int i;
if ( c == 0 )
    i = 0;

这会使错误消失。

但是您要实现的目标并不需要您拥有全局变量c。

你可以简单地做

static int i = 0;
i++;

第一次将它设置为零,因此它不会被初始化。

答案 4 :(得分:-1)

因为,变量'i'的范围仅在内部(if)。所以当你递增'i'时,编译器会抛出错误。

答案 5 :(得分:-2)

添加其他人提到的大括号不会解决问题。真正的解决方案是完全删除if (c == 0)行。 i的静态声明应该是函数的第一行。

你想要的是这个:

int test()
{
    static int i=1;

    if(i==5)
        printf("%d\n",i);
    else
        test();
}