一个最小的工作示例如下:
#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
?
但是,当第二次调用 func(( 时,int 在 func(( 的开头被重新赋值 5。
不,这不是赋值,而是初始化。静态局部变量只初始化一次,即第一次调用func()
时。
在块范围内声明的变量与说明符 static 有 静态存储持续时间,但首次初始化控制 通过它们的声明(除非它们的初始化为零 或常量初始化,可以在块之前执行 首次输入(。在所有进一步的调用中,将跳过声明。
您很可能对等号感到困惑,=
.
等号static int i = 5;
表示复制初始化,而不是赋值:
命名变量的复制初始化中的等号 = 不是 与赋值运算符相关。
因此
但是,int 在 func(( 的开头被重新赋值 5
这是错误的。它永远不会在func
开始时分配,无论是第一次还是以后的调用。它仅由i = 42;
分配。
你也可以这样写这行:
static int i(5);