C运算符+;=序列点?

C运算符+;=序列点?,c,pointers,language-lawyer,undefined-behavior,sequence-points,C,Pointers,Language Lawyer,Undefined Behavior,Sequence Points,这是定义的行为吗 *p += *p--; 如果它是,它是等价于{p[0]+=p[0];--p;}还是等价于{p[-1]=p[0];--p;} 我猜是否定义了,取决于+=是否有一个隐式序列点,如果有,我猜第二个块应该是正确的 编辑:我认为这不是建议问题的重复,因为主要问题是什么是序列点以及序列点如何影响行为。在我的例子中,我清楚地知道什么是序列点,问题是+=操作符是否有一个隐式序列点。这是未定义的行为,因为*p的求值与*p--的求值相关,是不排序的。没有序列点。对于所有赋值运算符,6.5.16:

这是定义的行为吗

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

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


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

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

更新左操作数的存储值的副作用是 在左操作数和右操作数的值计算之后排序。 操作数的求值是不排序的

6.5规定其为UB:

如果标量对象上的副作用相对于 对同一标量对象或值的不同副作用 使用相同标量对象的值进行计算时,行为为 未定义。如果存在多个允许的订单 表达式的子表达式,如果 未排序的副作用发生在任何订单中


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

更新左操作数的存储值的副作用是 在左操作数和右操作数的值计算之后排序。 操作数的求值是不排序的

6.5规定其为UB:

如果标量对象上的副作用相对于 对同一标量对象或值的不同副作用 使用相同标量对象的值进行计算时,行为为 未定义。如果存在多个允许的订单 表达式的子表达式,如果 未排序的副作用发生在任何订单中


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

更新左操作数的存储值的副作用是 在左操作数和右操作数的值计算之后排序。 操作数的求值是不排序的

6.5规定其为UB:

如果标量对象上的副作用相对于 对同一标量对象或值的不同副作用 使用相同标量对象的值进行计算时,行为为 未定义。如果存在多个允许的订单 表达式的子表达式,如果 未排序的副作用发生在任何订单中


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

更新左操作数的存储值的副作用是 在左操作数和右操作数的值计算之后排序。 操作数的求值是不排序的

6.5规定其为UB:

如果标量对象上的副作用相对于 对同一标量对象或值的不同副作用 使用相同标量对象的值进行计算时,行为为 未定义。如果存在多个允许的订单 表达式的子表达式,如果 未排序的副作用发生在任何订单中


可能的重复我在发布这篇文章时没有看到这个问题,但Lundin的答案对我来说肯定更清楚,你提到的问题的答案。可能的重复我在发布这篇文章时没有看到这个问题,但是Lundin的回答肯定比你提到的问题的答案更清楚。可能是我在发布这篇文章时没有看到这个问题的副本,但Lundin的回答肯定比你提到的问题的答案更清楚。可能是我在发布这篇文章时没有看到这个问题的副本,但伦丁的回答肯定比你提到的问题的答案更清楚。