首页 >后端开发 >C++ >为什么 `i = i 1;` 现在在 C 17 中是合法的?

为什么 `i = i 1;` 现在在 C 17 中是合法的?

Barbara Streisand
Barbara Streisand原创
2024-11-01 06:38:01715浏览

Why is `i = i     1;` now legal in C  17?

C 17 使 i = i 1 合法化;由于修改了算子求值顺序

在 C 11 中,赋值 i = i 1;被认为是未定义的行为。然而,在 C 17 中,它变成了有效的表达式。为了理解这一变化,我们需要深入研究修改后的运算符求值规则。

Pre-C 17 未定义行为

在 C 11 中,操作数求值的顺序赋值运算符的定义如下:

  • 操作数的值计算在赋值操作之前进行排序。
  • 标量变量的副作用相对于其他副作用是不排序的和值计算。

在 i = i 1; 中,后递增 i 表现出副作用(修改 i 的值),这可能与赋值操作交织发生。这种潜在的未排序副作用会导致未定义的行为。

C 17 的修订排序规则

C 17 为赋值运算符引入了新的排序规则:

  • 右操作数在左操作数之前排序。

此修订规则适用于右操作数的值计算和副作用。

合法化of i = i 1;

在 i = i 1; 中,右操作数是 i 1。该表达式的计算涉及括号内 i 的后缀增量,然后加 1根据新规则,整个评估是在对 i 赋值之前排序并完成的。

因此,在 C 17 中,修改 i 的行为(副作用)在实际赋值之前完成,从而消除了潜在的未排序的副作用。此修改后的排序使 i = i 1;表达式在 C 17 中合法。

以上是为什么 `i = i 1;` 现在在 C 17 中是合法的?的详细内容。更多信息请关注PHP中文网其他相关文章!

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