代码之家  ›  专栏  ›  技术社区  ›  Saif

C++中隐式变量的初始化

  •  1
  • Saif  · 技术社区  · 7 年前
    #include <iostream>
    
    int a;
    void foo();
    
    int main() 
    {
     std::cout << "a = " << a << std::endl;
     foo();
     return 0;
    }
    
    void foo(){
        int b;
        std::cout << "b = " << b << std::endl;
    }
    

    输出:

    a = 0
    b = 32650
    

    我创建了一个名为 foo 这宣告了 int 变量并打印出来。它会打印一些垃圾值,因为 b 在声明时未初始化,则如何 a 初始化为 0 每次?

    为什么是 初始化为 虽然 被初始化为一些垃圾值?

    2 回复  |  直到 7 年前
        1
  •  1
  •   user    7 年前

    从C++ 17标准草案(其他标准几乎相同):

    3.62.非局部变量的初始化[Basic,Simult.init ]

    变量 静态存储 持续时间(3.7.1)或线程存储持续时间(3.7.2)应为 零初始化 (8.5)在进行任何其他初始化之前。

    3.7.1静态存储持续时间[BASIC,STC.static ]

    所有不具有动态存储持续时间、不具有线程存储持续时间的变量,以及 非本地有 静态存储时间 . 这些实体的储存应 持续时间 程序 (3.6.2、3.6.3)。

    如果你深入研究定义,你会发现 a 实际上有静态存储持续时间(它是全局变量),因此它是零初始化的。

        2
  •  2
  •   AnT stands with Russia    7 年前

    在C++语言标准的原始版本中,所有变量都有 静态存储时间 在进行任何其他初始化之前初始化为零。

    在现代C++这个初始化阶段(AKA) 静态初始化 )被分成 常数初始化 (对于具有显式常量初始值设定项的变量)和 零初始化 (其他一切)。你的 a 属于第二类。所以你的 初始化为零。

    非类类型的自动变量,如 b 以不确定的价值开始他们的生活,除非你明确地初始化它们。在表达式中使用该不确定值会导致未定义的行为。