我刚刚注意到,可以使用c99c11c++11标准使用clang/gcc/clang++/g++编译以下代码。

int main(void) {
    int i = i;
}

即使使用-Wall -Wextra,也没有编译器报告警告。

通过将代码修改为int i = i + 1;并使用-Wall,他们可以报告:
why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
    int i = i + 1;
        ~   ^
1 warning generated.

我的问题:
  • 为什么编译器甚至允许这样做?
  • C/C++标准对此有何评论?具体来说,这是什么行为? UB还是依赖于实现?
  • 最佳答案

    因为i在用于初始化自身时未初始化,所以它当时的不确定值。不确定值可以是未指定值陷阱表示形式

    如果您的实现支持整数类型的填充位,并且所讨论的不确定值恰好是陷阱表示,那么使用它会导致未定义行为

    如果您的实现没有整数填充,那么该值就是 unspecified ,并且没有未定义的行为。

    编辑:

    为了进一步详细说明,如果i从未在某个时间获取其地址,则该行为仍然无法定义。 C11标准的6.3.2.1p2部分对此进行了详细说明:



    因此,如果您从不使用i的地址,那么您将有未定义的行为。否则,以上声明适用。

    关于c++ - 未初始化的变量用作其自身的初始化程序的行为是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54200465/

    10-15 16:41