小编Sin*_*ngh的帖子

不是 a[i++] = 1 (一) 其中,增量的计算相对于数组的索引是无序的,导致违反 S6.5.2

问题长度字数限制..

正如@Karl Knechtel所指出的,我很困惑,是否获取相对于增量操作未排序的数组索引操作i++?如果它们没有排序,为什么 C 标准 6.5.2 行提到(强调添加到我理解的单词/短语中,适用于此处)

如果标量对象上的副作用 对于同一标量对象上的不同副作用或使用同一标量对象的值的值计算是无序的,则行为是未定义的。

我读了这个问题,我无法理解 C99 中的一些句子,其中 OP 试图理解为什么a[i++] = 1未定义。Pascal Cuoq已接受且得票最高的答案之一提到这是定义的行为。

-std=c99我还尝试使用,-Wall-Wextra标志以及一系列其他标志(基本上是 GCC 11.2.0 中启用的所有标志)来编译程序,但代码没有抛出任何警告

然而,我的问题/困惑是为什么这是一个定义的行为?

来自C11标准S6.5.2

如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值的值计算是无序的,则行为是未定义的。如果表达式的子表达式有多个允许的排序,并且在任何排序中出现此类未排序的副作用,则行为未定义。

在阅读了 SO 上的大多数线程(带有标签[C][sequence-points])后,我的理解/推理是 i++ 会导致更新 i 值的副作用。在这种情况下,这个副作用不会被排序到使用相同缩放器对象的值计算。我的理解是a[integer object]构成value computation。那么,它应该是未定义的行为吗?

即使从 C99 S6.5(p2)

此外,应只读先前值以确定要存储的值。

我理解/解释这个表达式也应该呈现a[i++] = 1未定义?

c language-lawyer

1
推荐指数
1
解决办法
154
查看次数

标签 统计

c ×1

language-lawyer ×1