在编程领域,使用未初始化的变量通常是一个值得关注的问题。未初始化的变量被用作自己的初始化程序的情况下,会出现一种独特的情况。
考虑以下代码:
int main(void) { int i = i; }
令人惊讶的是,这段代码可以用 clang/gcc 编译/clang /g 使用 11 等标准。此外,当您指定 -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标准是如何规定的?
编译器容差
变量 i 在自初始化时未初始化,因此此时它有一个非特定值。非特定值是未指定值或陷阱表达式。
如果实现支持整数类型的填充位并且非特定值是陷阱表达式,那么使用它将导致未定义的行为。
如果实现没有整数填充位,则该值只是未指定并且不会发生未定义行为。
标准条款
C11 标准详细信息第 6.3.2.1p2 节:
左值表示一个具有自动存储期限的对象,该对象可以使用寄存器存储类声明(地址从未被占用),并且该对象未初始化(如果它没有在初始化器中声明并且没有赋值在使用之前执行),其行为是未定义的。
因此,如果你从未获得 i 的地址,你将得到未定义的行为。否则,适用上述声明。
以上是为什么编译器允许 C/C 中的变量自初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!