如果我以这种方式在函数中声明一个静态变量:
static int i=4;
//custom code
i++;
它按预期工作,即它在函数调用之间维护变量值。
但如果我声明如下:
static int i;
i=4;
//custom code
i++;
它不会在调用之间维护值,并且像局部变量一样工作。
这是否意味着“i”不再是函数内部的静态变量?这种行为背后的原因是什么?
extern
关键字也会出现类似的情况。
如果我以这种方式在函数中声明一个静态变量:
static int i=4;
//custom code
i++;
它按预期工作,即它在函数调用之间维护变量值。
但如果我声明如下:
static int i;
i=4;
//custom code
i++;
它不会在调用之间维护值,并且像局部变量一样工作。
这是否意味着“i”不再是函数内部的静态变量?这种行为背后的原因是什么?
extern
关键字也会出现类似的情况。
它在函数调用中保存它的值,但是当您分配这样的变量时:
static int i=4;
它只分配一次。当你这样做时:
static int i;
i=4;
它的意思是:'创建一个变量一次。4
每次函数运行时分配给它。'。
一个小演示:ideone
初始化(第一个代码)与赋值(第二个代码)不同。
在第二个代码中,它确实在函数调用中保持其值,但随后它被分配给另一个值4
。
void foo()
{
static int i;
// i remains its value from the last call
i=4; //here it's assigned to 4
//custom code
i++;
}
In your second code statement you are overwriting the value of i.
that is why it seems to work like local variable.
It is not though.
初始化和赋值都不同在第一步中,您通过在第二步中分配来进行初始化
如果一个变量是静态的,初始化只进行一次,赋值可能是多次
这就是在第一种情况下,值是持久的 b/n 不同调用的原因