未初始化的变量自初始化:危险和标准
下面的 C/C 代码片段:
int i = i;
引起了开发人员的关注,因为它使用未初始化的变量来初始化自身。现代编译器在没有警告的情况下接受此代码,引发了对其合法性和标准定义的底层行为的质疑。
编译器接受和标准
根据 C11 标准,未初始化的变量具有不确定的值,该值可以是未指定的值或陷阱表示。在不确定值恰好是陷阱值的情况下,如果实现支持整数填充位,则使用它可能会导致未定义的行为。
但是,如果实现不使用填充,则该值是未指定的,并且不存在未定义的行为。
未定义的场景
行为如果变量的地址从未被获取,那么使用未初始化的变量进行自初始化将变得更加不可预测。 C11 标准第 6.3.2.1p2 节阐明,对于可以使用寄存器存储类声明的自动存储持续时间的对象,此类用法未定义。
含义
尽管编译器接受,但不建议使用未初始化的变量进行自初始化。根据实现的不同,它可能会导致错误的行为或潜在的未定义行为,从而使代码不可靠。始终显式初始化变量以避免这些陷阱。
以上是C/C 中未初始化变量的自初始化是未定义行为吗?的详细内容。更多信息请关注PHP中文网其他相关文章!