gpt4 book ai didi

c++ - 在 C++ 中,用自身初始化全局变量是否具有未定义的行为?

转载 作者:行者123 更新时间:2023-12-04 04:26:11 26 4
gpt4 key购买 nike

int i = i;

int main() {
int a = a;
return 0;
}
int a = a肯定有未定义的行为(UB),更多细节在
Is reading an uninitialized value always an undefined behaviour? Or are there exceptions to it? .
但是 int i = i呢? ?在 C++ 中,我们可以为全局变量分配非常量值。 i在遇到声明之前声明并零初始化(因为它具有文件范围)。在这种情况下,我们将分配 0稍后在定义中对其进行说明。
可以说这没有 UB 吗?

最佳答案

令人惊讶的是,这并不是未定义的行为。

Static initialization [basic.start.static]

Constant initialization is performed if a variable or temporary objectwith static or thread storage duration is constant-initialized. Ifconstant initialization is not performed, a variable with staticstorage duration or thread storage duration is zero-initialized.Together, zero-initialization and constant initialization are calledstatic initialization; all other initialization is dynamicinitialization. All static initialization strongly happens before anydynamic initialization.


重要部分加粗。 “静态初始化”包括全局变量初始化,“静态存储持续时间”包括全局变量,以上条款在这里适用:
int i = i;
这不是常量初始化。因此,零初始化是根据上述条款完成的(对于基本整数类型零初始化意味着,毫不奇怪,它被设置为 0)。上述条款还规定在动态初始化之前必须进行零初始化。
那么,这里发生了什么:
  • i被初始化为 0。
  • i然后从自身动态初始化,所以它仍然是 0。
  • 关于c++ - 在 C++ 中,用自身初始化全局变量是否具有未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67979228/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com