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