首页 > 解决方案 > C++ 中的隐式变量初始化

问题描述

#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

标签: c++c++11initialization

解决方案


来自 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实际上具有静态存储持续时间(它是全局变量),因此它是零初始化的。


推荐阅读