【发布时间】:2018-05-30 15:16:50
【问题描述】:
围绕 C 语句 x = b[i] + i++; 及其定义展开了讨论。
所述语句未定义的论点如下:
C99 的第 6.5 条规定:
[...] 子表达式的求值顺序和副作用发生的顺序均未指定。
因此,不能保证i 在下标运算符中用作数组的索引后会自增。
但是,我对上述规范的解释不同。
C99 的第 6.5 节另外规定:
在上一个和下一个序列点之间,一个对象应该有它的存储值 通过表达式的评估最多修改一次。此外,先验值 应为只读以确定要存储的值。
C99 的第 5.1.2.3 条规定:
在 执行序列中的某些指定点称为序列点,所有副作用 之前的评估应该是完整的,并且没有后续评估的副作用 应该已经发生了。
附件 C 中给出了序列点列表,只有以下内容与有问题的陈述相匹配,恕我直言。
完整表达式的结尾
b[i](b 的元素i 的值)和i++(只是i)的评估可以在添加之前以任何顺序发生(以及= 的评估,这是RHS的值)完成。但是,整个语句的副作用被推迟到所有这些评估之后,因为这是唯一的序列点。在这种情况下,副作用是x 的变化和i 的增量。
谁是对的?是否有与论点相关的其他段落?在 C++ 中有什么不同吗?
【问题讨论】:
-
未定义。副作用不会被推迟。它们保证发生在序列点之后,但不强制不发生在之前。
-
投反对票的人能否解释一下他/她的投票,以便我们改进问题?
标签: c undefined-behavior operator-precedence