几天前这里有一个关于是否表达的讨论
我 = ++我 + 1
是否调用 UB(未定义行为)。
最后得出的结论是,它调用 UB,因为“i”的值在两个序列点之间变化不止一次。
在同一线程中,我参与了与Johannes Schaub的讨论。据他介绍
i=(i,i++,i)+1 ------ (1) /* 也调用 UB */
我说 (1) 不会调用 UB,因为前面的子表达式的副作用被 i 和 i++ 之间以及 i++ 和 i 之间的逗号运算符 ',' 清除。
然后他给出了以下解释:
“是的,在 i++ 之后的序列点完成了它之前的所有副作用,但是没有什么可以阻止赋值副作用与 i++ 的副作用重叠。根本问题是赋值的副作用没有指定在之后发生或在评估赋值的两个操作数之前,因此序列点在保护这个方面无能为力:序列点导致偏序:仅仅因为在 i++ 之后和之前有一个序列点并不意味着所有副作用都是有序的关于 i。
另外,请注意,仅仅一个序列点没有任何意义:评估的顺序不是由代码的形式决定的。它由语义规则决定。在这种情况下,没有语义规则来说明何时发生赋值副作用,以评估其操作数或这些操作数的子表达式”。
用“粗体”写的声明使我感到困惑。我所知道的:
“在被称为序列点的执行序列中的某些指定点,之前评估的所有副作用都应该是完整的,并且后续评估的副作用应该没有发生。”
因为,逗号运算符还指定执行顺序,所以当我们到达最后一个 i.He(Johannes) 时,i++ 的副作用已被取消)。
所以我只想知道(1)是否调用UB?。有人可以给出另一个有效的解释吗?
谢谢!