首页 >后端开发 >C++ >为什么'i = i 1”在 C 17 中合法,但在 C 11 中行为未定义?

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-27 09:53:30346浏览

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中文网其他相关文章!

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