当p和q指向同一个对象时,"*p = ++(*q)"是否未定义?

Nya*_*yan 12 c c99 operator-precedence sequence-points

在阅读序列点后,我了解到这i = ++i是未定义的.

那么这段代码怎么样:

int i;
int *p = &i;
int *q = &i;
 *p = ++(*q);           // that should also be undefined right?
Run Code Online (Sandbox Code Playgroud)

假设p和q的初始化取决于某些(复杂)条件.他们可能像上面的情况一样指向同一个对象.会发生什么?如果未定义,我们可以使用哪些工具进行检测?

编辑:如果两个指针不应该指向同一个对象,我们可以使用C99限制吗?这是"严格"的意思吗?

Chr*_*odd 12

是的,这是未定义的行为 - 您对对象进行了两次修改,它们之间没有序列点.不幸的是,自动检查是非常困难的 - 我能想到的最好的就是assert(p != q)在此之前添加,这至少会给出一个干净的运行时故障,而不是更糟糕的事情.在一般情况下,在编译时检查它是不可判定的.