这是定义的行为吗?
*p += *p--;
如果是,是等同于{ p[0] += p[0]; --p; }
还是{ p[-1] = p[0]; --p; }
?
我猜测被定义与否取决于+=
是否有一个隐含的序列点,如果有,我的猜测是第二个块应该是正确的。
编辑:我认为这不是建议问题的重复,因为主要问题是什么是序列点以及影响行为如何。在我的情况下,我清楚地知道序列点是什么,问题是具体关于+=
运算符是否具有隐式序列点。
答案 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:
如果标量对象的副作用相对于其中任何一个都没有排序 对同一个标量对象或值有不同的副作用 使用相同标量对象的值进行计算,行为是 未定义。如果有多个允许的排序 表达式的子表达式,如果这样的话,行为是不确定的 任何顺序都会出现无序的副作用。