初始化和左值到右值的转换
所提供的代码片段引发了 C 中常见的争议问题。用自身初始化变量(如 int x = x; 中所示)涉及左值到右值的转换。问题是,考虑到右侧的“x”是未初始化的值,并且通常禁止对未初始化值进行左值到右值的转换,这种转换是否会导致未定义的行为(UB)。
预期左值到右值转换的证据
虽然 C 11 标准缺乏关于值的明确规范语言结构所期望的类别,间接证据表明右值是默认期望。
应用程序到初始化器转换
通过类比内置运算符的行为,可以合理地假设复制初始化也期望纯右值作为初始值设定项。以下内容进一步支持了这一假设:
代码片段的含义
在复制初始化需要纯右值的假设下,代码片段 int x = x;确实会导致UB。这是因为右侧的“x”是未初始化的左值,其左值到右值的转换将导致不确定的值。
进一步证据
拟议的缺陷报告强调需要澄清具有不确定值的对象上的左值到右值转换会导致 UB。此提议的更改进一步支持复制初始化不应允许此类转换的概念。
结论
根据现有证据,最有可能的是 int x = x;构成 C 中的 UB ,因为禁止未初始化的 'x' 上的左值到右值转换。然而,值得注意的是,该标准缺乏对预期值类别的明确规范,为持续争论留下了一些空间。
以上是由于左值到右值转换,'int x = x;”在 C 中是否存在未定义行为?的详细内容。更多信息请关注PHP中文网其他相关文章!