【问题标题】:Why does the static modifier prevent its variable to be reassigned with a new value?为什么静态修饰符会阻止其变量被重新分配新值?
【发布时间】:2017-09-12 03:29:07
【问题描述】:

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

#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() 被第二次调用时,intfunc() 开头被重新赋值为 5时间。

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

【问题讨论】:

  • 因为静态变量只初始化一次。
  • 我作为新手正在试验代码;但是,我认为你是对的。我相应地改变了问题。我不能投票;因此,谢谢。
  • 它没有。你误解了你的证据。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    static int i = 5; 中的等号表示copy initialisation,而不是赋值:

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

    因此,

    然而,int在func()的开头被重新赋值为5

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

    你也可以这样写:

    static int i(5);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2021-08-07
      • 1970-01-01
      相关资源
      最近更新 更多