首页  >  文章  >  后端开发  >  为什么编译器允许 C/C 中的变量自初始化?

为什么编译器允许 C/C 中的变量自初始化?

Susan Sarandon
Susan Sarandon原创
2024-11-16 06:50:03525浏览

Why does the compiler allow self-initialization of variables in C/C  ?

自初始化中的未初始化变量:行为和标准

在编程领域,使用未初始化的变量通常是一个值得关注的问题。未初始化的变量被用作自己的初始化程序的情况下,会出现一种独特的情况。

考虑以下代码:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn