C运算符+=序列点?

C operator += Sequence point?

这是定义的行为吗?

*p += *p--;

如果是,它等同于 { p[0] += p[0]; --p; } 还是 { p[-1] = p[0]; --p; }

我猜是否定义取决于 += 是否有隐式序列点,如果有,我猜第二个块应该是正确的。

编辑:我认为这不是建议问题的重复,因为主要问题是什么是序列点以及如何影响行为。在我的例子中,我清楚地知道什么是序列点,问题是 特别是 关于 += 运算符是否具有隐式序列点。

这是未定义的行为,因为 *p 的计算与 *p-- 的计算相关是无序的。没有序列点。对于所有赋值运算符,6.5.16:

The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands. The evaluations of the operands are unsequenced.

6.5表示是UB:

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.