我读到:静态变量只初始化一次(与自动变量不同),静态变量的进一步定义将在运行时被绕过。 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;
}
答案 0 :(得分:4)
您可以在if
的本地范围内定义变量。它外面没有范围。 static
仅处理范围(也称为生命周期)。
使用花括号和缩进。然后你会看到你的错误。
答案 1 :(得分:1)
因为i
的范围只是以下代码中的if块:
if(c==0)
static int i=0;
与
相同if(c==0)
{
static int i=0;
}
i
在if 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();
}