c++ - 为什么静态修饰符阻止其变量重新分配新值?

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

#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

最佳答案

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


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


  在块范围内使用说明符static声明的变量具有
  静态存储持续时间,但在第一次控制时已初始化
  通过其声明(除非其初始化为零,
  或常量初始化,可以在代码块被执行之前执行
  第一次输入)。在所有其他调用上,将跳过声明。

本文翻译自 https://stackoverflow.com/questions/43435792/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c++ static initialization variable-assignment modifiers


相关文章:

c++ - 如何合并一个pImpl接口,同时还允许WndProc与之交互?

java - 公共静态最终要求初始化,但公共最终不需要

c++ - C ++:如何使用初始化列表初始化内部结构的成员?

c++ - MFC应用程序无提示关闭[关闭]

c++ - 通信Arduino-C ++不读Arduino

c++ - 在此“简单”初始化中,i的值是什么?

c++ - 部分模板特化触发static_asserts

java - 无法在try / catch中初始化静态最终变量

java - 静态变量和块之间的执行顺序如何执行?

c++ - C ++对象创建和内存分配