【发布时间】:2016-12-21 21:45:41
【问题描述】:
正如comp.lang.c FAQ 中提到的,C 标准规定:
在前一个序列点和下一个序列点之间,一个对象应该有它的 表达式的评估最多修改一次存储的值。 此外,应仅访问先验值以确定 要存储的值。
但是,这个(now deleted) article 表示a = ++b + ++c; 是未定义的。有人可以解释为什么这是未定义的行为吗?
【问题讨论】:
-
我认为甘斯尔先生在这种情况下是错误的。
-
一种使其成为 UB 的方法:
#define b a -
这看起来像是文章中的错误。
-
请注意,
a = ++b+++c;确实是不正确的,而是违反约束而不是未定义的行为。 -
我不知道为什么那会是未定义的。很明显
++b的值为b + 1。像a = ++b + ++b这样的东西是另一回事。
标签: c language-lawyer