【发布时间】:2020-10-16 16:15:42
【问题描述】:
我是 C++ 新手,在学习 C++ 时遇到了这个问题。
这里是代码
#include <iostream>
using namespace std;
void another_func() {
int a;
cout << a << endl;
}
int main() {
int a;
cout << a << endl;
another_func();
}
我正在使用g++ (GCC) 10.1.0,我发现每次运行代码时,main 函数中的a 将被初始化为0,而another_func 中的a 将是随机数。如下,
➤ g++ test.cpp && ./a.out
a in main: 0
a in another_func: 32612
据我所知,局部变量存储在堆栈中,它们没有自动初始化机制。所以another_func 中的a 是预期的。但是,谁能告诉我为什么main函数中的a被初始化为0?
提前致谢!
【问题讨论】:
-
其中一些可能取决于您使用的编译器标志。您应该在问题中指定这些内容。
-
如果算术类型没有显式初始化,它可能是无符号、负数或零,并且为零,并不意味着它具有特定的行为。
-
So the a in another_func is expected注释掉main中的cout行并再次运行。您很可能会得到另一个a的不同值,甚至可能是0。 -
这称为未定义行为,它是C++(和C)的一部分。对于某些程序,它们违反了语言标准中的规则,但编译器不需要报告诊断,也不需要做任何明智的事情。在许多情况下,您看到的行为是编译器仅对遵循规则的程序实施正确行为的意外结果