这是明确的行为吗?

*p += *p--;

如果是的话,它等于{ p[0] += p[0]; --p; }还是{ p[-1] = p[0]; --p; }
我猜是否被定义取决于+=是否有一个隐式序列点,如果有,我的猜测是第二个块应该是正确的。
编辑:我认为这不是一个重复的建议问题,因为主要的问题是什么是序列点和如何影响行为。在我的例子中,我清楚知道什么是序列点,问题是关于+=运算符是否有隐式序列点。

最佳答案

这是未定义的行为,因为对*p的计算与对*p--的计算有关,而不是按顺序进行的。没有序列点。对于所有赋值运算符,6.5.16:
更新左操作数的存储值的副作用是
在左操作数和右操作数的值计算之后排序。
操作数的求值是不排序的。
6.5声明为UB:
如果标量对象上的副作用相对于
对同一标量对象或值的不同副作用
使用相同标量对象的值进行计算时,行为为
未定义。如果有多个允许的
表达式的子表达式,如果
未排序的副作用出现在任何排序中。

关于c - C运算符+ =序列点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30457904/

10-12 05:30