C++中的静态变量

4

今天我遇到了一个有趣的问题。请看下面的伪代码:

void Loop()
{
   static int x = 1;
   printf("%d", x);
   x++;
}

void main(void)
{
    while(true)
    {
       Loop();
    }
}

即使x是静态的,为什么这段代码每次都不仅仅只打印出“1”呢?在打印之前,我每次都将x重新初始化为1。但不知何故,x按预期递增。

4个回答

9
静态变量的初始化仅在第一次发生。之后,该实例将在所有对函数的调用之间共享。

3

我在每次迭代中都将x重新初始化为1。

不,你没有这样做:你只是将其初始化为1,但它只会被初始化一次。


1

static并不意味着const

来自MSDN:

当修改变量时,static关键字指定变量具有静态持续时间(在程序开始时分配,在程序结束时释放)并将其初始化为0,除非指定了另一个值。当在文件作用域处修改变量或函数时,static关键字指定变量或函数具有内部链接(其名称在声明它的文件之外不可见)。

在函数中声明为static的变量保留其在调用该函数之间的状态。

在类声明中修改数据成员时,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将按预期递增,因为这个值是保留的。

1
在编程中,static关键字表示该值应该在函数调用之间保留。初始化只会执行一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接