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

时间:2018-06-19 19:34:11

标签: c++ c++11 initialization

#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

为什么a被初始化为0,而b被初始化为垃圾值?

2 个答案:

答案 0 :(得分:2)

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

在现代C ++中,此初始化阶段(又称为静态初始化)分为常量初始化(用于带有显式常量初始化程序的变量)和零初始化(用于其他所有内容)。您的a属于第二类。因此,您的a被零初始化了。

非类类型的自动变量(例如b)会使用不确定的值开始它们的生命,除非您明确地对其进行初始化。在表达式中使用该不确定值会导致不确定的行为。

答案 1 :(得分:1)

摘自c ++ 17标准草案(其他标准几乎相同)

  

3.6.2非局部变量的初始化[basic.start.init]

     

...

     

具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量必须先进行零初始化(8.5),然后再进行其他初始化

     

...

     

3.7.1静态存储持续时间[basic.stc.static]

     

...

     

所有没有动态存储持续时间,没有线程存储持续时间并且是   不是本地的   静态储存期   。这些实体的存储应在   程序(3.6.2、3.6.3)。

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