-3

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

那么为什么我在下面给出的代码中收到“我没有声明”的错误。我编写的程序使得静态变量“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;
}
4

6 回答 6

4

您在 的本地范围内定义变量if。它在外面没有范围。static只处理范围(也就是生命周期)。

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

于 2017-03-02T06:05:13.183 回答
1

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

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

如同

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

i外不可用if block

于 2017-03-02T06:05:30.280 回答
0

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

于 2017-03-02T06:09:29.917 回答
0

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

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

这将使错误消失。

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

你可以简单地做

static int i = 0;
i++;

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

于 2017-03-02T06:48:36.183 回答
-1

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

于 2017-03-02T06:06:24.143 回答
-2

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

你想要的是这样的:

int test()
{
    static int i=1;

    if(i==5)
        printf("%d\n",i);
    else
        test();
}
于 2017-03-02T06:11:30.797 回答