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

why static variable initialised in each calling of function but we have to declare it every time in C

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

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

#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;
}

您在 if 的局部范围内定义变量。它没有 scope 外部。 static 仅处理 extent(也称为生命周期)。

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

因为i的作用域就是下面代码中的if块:

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

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

iif block

之外不可用

是因为,变量'i'的作用域只在(if)里面。因此,当您递增 'i' 时,编译器将抛出错误。

如果您将 static 变量放入块或函数中,那么该变量将不再超出范围,因为没有大括号 {} 只有 if 之后的第一个语句是执行。所以它不能在其他地方使用,编译器会报错。

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

你要的是这个:

int test()
{
    static int i=1;

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

要修复编译错误,请在条件之外声明 I。并在条件 -

内将其设置为零
static int i;
if ( c == 0 )
    i = 0;

这将使错误消失。

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

你可以简单地做

static int i = 0;
i++;

第一次会被置零,以后不会再初始化。