这是明确的行为吗?
*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/