C运算符+ =序列点?

时间:2015-05-26 11:57:11

标签: c pointers language-lawyer undefined-behavior sequence-points

这是定义的行为吗?

*p += *p--;

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

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

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

1 个答案:

答案 0 :(得分:3)

这是未定义的行为,因为@Stateful // it could work without @Stateful (but Serializable) but I haven't tested enough @UnitOfWorkScoped public class EntityManagerProducer { @PersistenceContext(type = EXTENDED) private EntityManager entityManager; @Produces @UnitOfWorkScoped @TransactionAttribute(NOT_SUPPORTED) public EntityManager entityManager() { return entityManager; } } 的评价与@Retention(RUNTIME) @NormalScope(passivating = true) @DynamicScope({ @Scope(scope = ThreadScoped.class), @Scope(scope = ConversationScoped.class, ifExpression = "#{not javax.enterprise.context.conversation.transient}"), @Scope(scope = ViewScoped.class, ifExpression = "#{not facesContext.viewRoot.transient}"), @Scope(scope = RequestScoped.class) }) public @interface UnitOfWorkScoped {} 的评估无关。没有序列点。对于所有赋值运算符,6.5.16:

  

更新左操作数的存储值的副作用是   在左右操作数的值计算之后排序。   对操作数的评估是不合理的。

6.5表明它是UB:

  

如果标量对象的副作用相对于其中任何一个都没有排序   对同一个标量对象或值有不同的副作用   使用相同标量对象的值进行计算,行为是   未定义。如果有多个允许的排序   表达式的子表达式,如果这样的话,行为是不确定的   任何顺序都会出现无序的副作用。