You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中使用自身初始化全局变量是否属于未定义行为?

int i = i;

int main() { 
 int a = a;
 return 0;
} 

结论先行

  • 局部变量int a = a是明确的未定义行为(UB)
  • 全局变量int i = i同样属于未定义行为,不存在“因为零初始化所以合法”的说法

具体规则解释

对于静态存储期的全局变量,C++的初始化流程和生命周期规则如下:

  1. 所有静态存储期对象首先会执行零初始化,此时i对应的内存确实会被填充为0值。
  2. 但对象的生命周期从初始化完全完成的时刻才正式启动,零初始化只是初始化流程的前置环节,此时i的生命周期尚未开始。
  3. 后续执行动态初始化时,初始化器中的i需要做左值到右值的转换来读取存储值,标准明确规定在对象生命周期开始前读取其存储值的行为属于未定义行为,和内存中是否已经写入了0没有关联。

部分编译器处理该代码时最终i的取值为0,这只是特定编译器的实现选择,不代表该写法是可移植的、被标准认可的合法写法。


内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 21:54:02