0
#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

4

2 回答 2

2

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

于 2018-06-19T20:05:12.983 回答
2

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

在现代 C++ 中,这个初始化阶段(又名静态初始化)分为常量初始化(对于具有显式常量初始化器的变量)和零初始化(对于其他所有内容)。你a属于第二类。所以你a是零初始化的。

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

于 2018-06-19T19:58:00.813 回答