我刚刚注意到,可以使用c99
,c11
和c++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.
我的问题:
最佳答案
因为i
在用于初始化自身时未初始化,所以它当时的不确定值。不确定值可以是未指定值或陷阱表示形式。
如果您的实现支持整数类型的填充位,并且所讨论的不确定值恰好是陷阱表示,那么使用它会导致未定义行为。
如果您的实现没有整数填充,那么该值就是 unspecified ,并且没有未定义的行为。
编辑:
为了进一步详细说明,如果i
从未在某个时间获取其地址,则该行为仍然无法定义。 C11标准的6.3.2.1p2部分对此进行了详细说明:
因此,如果您从不使用i
的地址,那么您将有未定义的行为。否则,以上声明适用。
关于c++ - 未初始化的变量用作其自身的初始化程序的行为是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54200465/