首页 > 后端开发 > C++ > 正文

为什么'i = i 1”在 C 17 中合法,但在 C 11 中行为未定义?

Mary-Kate Olsen
发布: 2024-10-27 09:53:30
原创
261 人浏览过

Why is

使 i = i 1 在 C 17 中合法

在 C 11 中,表达式“i = i 1”是未定义的行为,因为测序保证不足。然而,在 C 17 中,这个表达式变得合法。原因如下:

C 11

在 C 11 中,赋值运算符 (=) 的排序规则规定,赋值是在右值计算之后排序的和左操作数。然而,对于右操作数中的赋值和副作用的相对顺序,不存在特定的规则。这种缺乏排序的情况导致了像“i = i 1”这样的情况下的未定义行为,其中副作用(增加 i)和分配可能是未排序的。

C 17

C 17 为赋值运算符引入了新的排序规则:“右操作数在左操作数之前排序。”这意味着在对左操作数执行任何操作(包括赋值本身)之前,右操作数中的所有副作用和值计算都会完全排序。

对“i = i 1”的影响

使用 C 17 中的新排序规则,表达式“i = i 1”变得合法,因为增加 i 的副作用(由后缀运算符执行)现在保证在赋值之前发生。因此,将“i 1”的值赋给 i 的行为与副作用完全隔离,消除了 C 11 中存在的未定义行为。

综上所述,赋值的排序规则的变化C 17 中的运算符确保“i = i 1”的计算遵循特定顺序,允许递增 i 的副作用先于赋值本身,从而解决了 C 11 中存在的未定义行为。

以上是为什么'i = i 1”在 C 17 中合法,但在 C 11 中行为未定义?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!