我今天遇到了一个有趣的问题。看看这个伪代码:
void Loop()
{
static int x = 1;
printf("%d", x);
x++;
}
void main(void)
{
while(true)
{
Loop();
}
}
即使x是静态的,为什么这段代码每次只打印“1”?在打印之前,我在每次迭代时将x重新初始化为1。但无论出于何种原因,x都会按预期递增。
答案 0 :(得分:9)
静态变量的初始化仅在第一次发生。之后,实例将在函数的所有调用中共享。
答案 1 :(得分:3)
我在每次迭代时将x重新初始化为
不,你不是:你把它初始化为1,但它只被初始化一次。
答案 2 :(得分:1)
static
并不代表const
。
来自MSDN:
修改变量时,静态 keyword指定变量 有静态持续时间(它被分配 当程序开始时 在程序结束时取消分配)和 除非另一个,否则将其初始化为0 值已指定。修改时 文件范围内的变量或函数, static关键字指定了 变量或函数具有内部 连接(其名称不可见 在它所在的文件之外 声明)。
在a中声明为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将按预期递增,因为值保留。
答案 3 :(得分:1)
static在此上下文中表示应该在对函数的调用之间保留值。初始化只进行一次。