首页 >后端开发 >C++ >由于左值到右值转换,'int x = x;”在 C 中是否存在未定义行为?

由于左值到右值转换,'int x = x;”在 C 中是否存在未定义行为?

Barbara Streisand
Barbara Streisand原创
2024-12-28 21:31:17204浏览

Is `int x = x;` Undefined Behavior in C   Due to Lvalue-to-Rvalue Conversion?

初始化和左值到右值的转换

所提供的代码片段引发了 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中文网其他相关文章!

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