为什么static修饰符会阻止使用新值重新分配其变量?

时间:2017-04-16 09:32:39

标签: c++ static initialization variable-assignment modifiers

最小的工作示例如下:

#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()被调用时, int func()的开头被重新赋值为5时间。

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

2 个答案:

答案 0 :(得分:4)

  

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

不,这不是assignment,而是initializationStatic local variables仅初始化一次,即第一次调用func()时。

  

在块作用域中使用指定符static声明的变量   静态存储持续时间但是在第一次控制时被初始化   通过他们的声明(除非他们的初始化为零 -   或者是常量初始化,可以在块之前执行   第一次进入)。在所有进一步的调用中,将跳过声明。

答案 1 :(得分:1)

您很可能会被等号=混淆。

等号static int i = 5;表示copy initialisation,而非作业:

  

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

因此,

  

但是,在func()

的开头将int重新赋值为5

这是错误的。 func的开头从未分配,无论是第一次还是以后的通话。它仅由<{1}}分配

你也可以写这样的一行:

i = 42;