首页  >  文章  >  后端开发  >  为什么 `int i = i;` 编译时会出现未定义的行为?

为什么 `int i = i;` 编译时会出现未定义的行为?

Linda Hamilton
Linda Hamilton原创
2024-11-11 07:21:03593浏览

Why Does `int i = i;` Compile with Undefined Behavior?

未初始化变量用作其自己的初始化程序的行为

C/C 中的此代码引发了有关其行为的问题:

int i = i;

尽管存在未初始化的变量,但此代码编译时不会出现警告和错误。为什么会发生这种情况,标准对其行为有何规定?

不确定值和实现依赖

当像 i 这样的变量用于初始化自身时,它包含一个不确定的值。该值可以是未指定的值或陷阱表示。未指定的值不是由标准定义的,并且取决于实现。如果实现支持陷阱表示,则在使用时会触发未定义的行为。

带有填充的未定义行为

如果实现以整数类型分配填充位,并且如果不确定值是陷阱表示,然后使用它会导致未定义的行为。这是因为访问陷阱表示会导致意外结果。

没有填充的未指定值

但是,如果实现不分配整数中的填充位,则不确定值是只是未指定。在这种情况下,不存在未定义的行为,i 的确切值由实现确定。

未定义的行为,地址已被占用

此外,该行为可以即使 i 没有获取其地址,也会变为未定义,如 C11 标准中所述:

“如果左值指定一个可以使用寄存器存储类声明的自动存储持续时间的对象(从未有其地址已获取),并且该对象未初始化,行为未定义。”

因此,此代码的行为依赖于实现,并且可能根据各种因素而未定义。

以上是为什么 `int i = i;` 编译时会出现未定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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