1

一个最小的工作示例如下:

#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的static修饰符使int的值在整个进程的生命周期内保持不变,而静态存储不存储在堆栈中;因此,该值从函数的一次调用传递到另一次调用。

但是,当第二次调用func ()时, int在 func()的开头重新赋值为 5 。

那么,为什么这个示例输出i = 42而不是i = 5

4

2 回答 2

4

但是,当第二次调用 func() 时, int 在 func() 的开头重新赋值为 5。

不,这不是赋值,而是初始化静态局部变量只初始化一次,即func()第一次调用的时候。

在块范围内使用说明符 static 声明的变量具有静态存储持续时间,但在控制第一次通过它们的声明时被初始化(除非它们的初始化是零或常量初始化,这可以在第一次进入块之前执行)。在所有进一步的调用中,将跳过声明。

于 2017-04-16T09:35:05.780 回答
1

你很可能被等号弄糊涂了,=

等号static int i = 5;表示复制初始化,而不是赋值:

命名变量的复制初始化中的等号=与赋值运算符无关。

因此,

但是 int 在 func() 开始时被重新赋值为 5

这是错误的。它永远不会在 的开头分配func,无论是第一次还是以后的调用。它由 分配i = 42;

你也可以这样写:

static int i(5);
于 2017-04-16T09:50:34.867 回答