为什么静态修饰符会阻止其变量重新赋值

Why does the static modifier prevent its variable to be reassigned with a new value?

本文关键字:新赋值 变量 赋值 静态 为什么      更新时间:2023-10-16

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

#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 的静态

修饰符使 int 的值在整个进程的生命周期内持久存在,而静态存储不存储在堆栈上;因此,该值从函数的一个调用传递到另一个调用。

但是,当第二次调用 func(( 时,intfunc(( 的开头被重新赋值 5。

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

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

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

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

您很可能对等号感到困惑,= .

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

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

因此

但是,int 在 func(( 的开头被重新赋值 5

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

你也可以这样写这行:

static int i(5);