最小的工作示例如下:
#include <iostream>
void func()
{
static int i = 5;
std::cout << i << std::endl;
i = 42;
std::cout << i << std::endl;
}
int main( int argc, char ** argv )
{
std::cout << "this is main()" << std::endl;
func();
func();
return 0;
}
其输出如下:
this is main()
i is 5
i is 42
i is 42
i is 42
变量 int 的静态修饰符使 int 的值在整个过程的生命周期内保持不变,而静态存储未存储在堆栈;因此,该值从函数的一次调用传递到另一个函数。
然而,当 func()被调用时, int 在 func()的开头被重新赋值为5时间。
那么,为什么这个示例输出i = 42
而不是i = 5
?
答案 0 :(得分:4)
但是,当第二次调用func()时,int会在func()的开头重新赋值为5。
不,这不是assignment,而是initialization。 Static local variables仅初始化一次,即第一次调用func()
时。
在块作用域中使用指定符static声明的变量 静态存储持续时间但是在第一次控制时被初始化 通过他们的声明(除非他们的初始化为零 - 或者是常量初始化,可以在块之前执行 第一次进入)。在所有进一步的调用中,将跳过声明。
答案 1 :(得分:1)
您很可能会被等号=
混淆。
等号static int i = 5;
表示copy initialisation,而非作业:
在命名变量的复制初始化中,等号 = 不是 与赋值运算符有关。
因此,
但是,在func()
的开头将int重新赋值为5
这是错误的。 func
的开头从未分配,无论是第一次还是以后的通话。它仅由<{1}}分配 。
你也可以写这样的一行:
i = 42;