【发布时间】:2015-01-09 18:00:04
【问题描述】:
我了解 C 使用序列点的概念来识别模棱两可的计算,并且 = 运算符不是序列点。但是,我在执行该语句时看不到任何歧义
i = ++i
根据我的理解,这仅相当于评估 &i 处的任何内容,将其递增,然后将其存储回同一位置。然而,GCC 将其标记为:
[警告] 'i' 上的操作可能是未定义的 [-Wsequence-point]
我是否遗漏了 = 的功能?
编辑:在标记为重复之前,请注意我已经浏览过其他关于序列点和未定义行为的帖子。它们都没有专门解决表达式i=++i(注意pre-increment)。提到的表达式通常是i=i++、a=b++ + ++b 等。我对它们中的任何一个都没有疑问。
【问题讨论】:
-
我认为您遗漏了一些关于
++的副作用如何发挥作用的内容。 -
返回的结果将是
i的递增值。但是i可能会在分配后递增。该标准规定副作用将在下一个序列点之前发生,但可能在分配之前或之后。 -
您的困惑可能是因为您不了解序列点。请参阅here 并查看此问题:stackoverflow.com/questions/4176328/…
-
不,你误会了。我并不是说
++i返回的值可能不同。我是说它总是会返回i+1。但是,增量副作用可能发生在分配之前或之后。副作用发生在 `a = ++b;'没有区别,因为没有自我分配。 -
@FredLarson 所以你是说返回
i+1的值和修改&i的值是独立事件吗?所以返回计算出来的值才是真正的操作,在i的内存位置增加值是使用++操作符的副作用吗?
标签: c increment undefined-behavior operator-precedence sequence-points