【发布时间】:2011-04-04 00:47:23
【问题描述】:
在阅读了序列点之后,我了解到i = ++i 是未定义的。
那么这段代码怎么样:
int i;
int *p = &i;
int *q = &i;
*p = ++(*q); // that should also be undefined right?
假设 p 和 q 的初始化是否取决于某些(复杂的)条件。 并且它们可能像上述情况一样指向同一个对象。 会发生什么?如果未定义,我们可以使用什么工具来检测?
编辑:如果两个指针不应该指向同一个对象,我们可以使用 C99 限制吗? 是“严格”的意思吗?
【问题讨论】:
-
一个该死的好问题! +1 来自我...嗯....
-
为什么
i = ++i;未定义?编译器必须从 RHS 表达式中获取一些值来执行赋值,并且预增量运算符将始终返回递增 1 的存储值,因此结果应该是可预测的。如果是i = i++;,那么它将是未定义的。 -
@Praetorian :它未定义。请参阅:第 5 章:第 4 点:
在前一个和下一个序列点之间,标量对象的存储值最多只能通过表达式的评估修改一次
-
@Praetorian:根据我对规则的理解,
i=i=i+1;将是未定义的,因为它两次写入一个变量而没有中间序列点。除此之外,我相信如果i不是易失性的,编译器可以通过计算y+1 来评估x=++y,将其存储到x(对于赋值运算符),然后再增加y。在某些处理器上,上述序列需要三个指令,x=++y;可能的最小值。
标签: c c99 operator-precedence sequence-points