gcc/g++是否存在Bug?用自身初始化未创建完成的变量
为什么
int number{number};运行时输出0而非预期的未定义值? 首先明确说:这绝对不是GCC/G的Bug,而是你碰到了C里未定义行为(Undefined Behavior, UB)的典型场景,加上编译器默认调试行为带来的“假象”。
先看你的代码:
#include "iostream" int main() { int number{number}; // wtf ? std::cout << "number=" << number << std::endl; }
用g++ -Wall编译时收到的警告完全正确:
main.cpp: In function ‘int main()’:
main.cpp:5:22: warning: ‘number’ is used uninitialized in this function [-Wuninitialized]
int number{number};
核心原因解析
按照C++的作用域规则,当你在声明变量number的初始化器里写number时,这个名字已经指向了正在被声明的变量——也就是说,你在尝试用未初始化的变量自身来初始化它。这属于标准明确规定的未定义行为:程序的行为完全没有约束,编译器可以生成任何代码。
那为什么你每次运行都得到number=0?这是因为GCC在默认的Debug编译模式下(未开启优化),会自动将栈上的未初始化变量清零(或者用特定调试值填充,这里刚好是0)。这是编译器为了方便调试做的友好处理,但绝对不是C++标准要求的行为。
如果你尝试用g++ -O2 -Wall编译这段代码再运行,很大概率会得到一个随机的垃圾值——因为开启优化后,编译器会放弃对未初始化栈变量的清零操作,直接使用内存里的原有数据。
总结
int number{number};是典型的未定义行为,标准不保证任何输出结果- 你看到的0只是GCC默认调试模式下的栈初始化特性,不是编译器Bug
- 编译警告已经清晰指出了问题,一定要重视这类未初始化变量的警告
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

