静态变量是如何初始化的,修改它们时会发生什么?

问题描述 投票:0回答:4

今天我遇到了一个有趣的问题。查看这个伪代码:

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

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

尽管 x 是静态的,为什么这段代码每次不只打印“1”呢?在打印之前,我会在每次迭代中将 x 重新初始化为 1。但无论出于何种原因,x 都会按预期递增。

c++ static
4个回答
9
投票

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


3
投票

我在每次迭代时将 x 重新初始化为 1

不,你不是:你将其初始化为 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


1
投票

在此上下文中,静态意味着应在函数调用之间保留值。初始化仅完成一次。

© www.soinside.com 2019 - 2024. All rights reserved.