今天我遇到了一个有趣的问题。查看这个伪代码:
void Loop()
{
static int x = 1;
printf("%d", x);
x++;
}
void main(void)
{
while(true)
{
Loop();
}
}
尽管 x 是静态的,为什么这段代码每次不只打印“1”呢?在打印之前,我会在每次迭代中将 x 重新初始化为 1。但无论出于何种原因,x 都会按预期递增。
静态变量的初始化仅在第一次发生。之后,该实例将在对该函数的所有调用之间共享。
我在每次迭代时将 x 重新初始化为 1
不,你不是:你将其初始化为 1,但它只初始化一次。
static
并不意味着const
。
来自 MSDN:
修改变量时,静态变量 关键字指定变量 具有静态持续时间(它被分配 当程序开始时并且 程序结束时释放) 和 将其初始化为 0,除非另一个 值已指定。当修改一个 文件范围内的变量或函数, static 关键字指定 变量或函数具有内部 链接(其名称在 在它所在的文件之外 声明)。
在 a 中声明静态的变量 函数在之间保留其状态 调用该函数。
当修改a中的数据成员时 类声明,static 关键字 指定该成员的一份副本 由所有实例共享 班级。修改成员时 类声明中的函数, static 关键字指定 函数仅访问静态成员。
static 的值在每个函数调用之间保留,例如(再次来自 MSDN):
// static1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void showstat( int curr ) {
static int nStatic; // Value of nStatic is retained
// between each function call
nStatic += curr;
cout << "nStatic is " << nStatic << endl;
}
int main() {
for ( int i = 0; i < 5; i++ )
showstat( i );
}
在您的示例中,x 将按预期增加,因为该值是 retained。
在此上下文中,静态意味着应在函数调用之间保留值。初始化仅完成一次。