这是对序列点之间同一对象的多次访问定义良好的行为

Is this multiple accesses to the same object between sequence points well-defined behavior?

本文关键字:访问 定义 对象 之间      更新时间:2023-10-16

允许多重访问吗?

#include <iostream>
int main()
{
    int A[1];
    A[0] = 0;
    A[A[0]] = 1;
    std::cout << A[0];
}

请参阅以下段落。。。

除非另有说明,否则单个操作数的求值顺序单个表达式的运算符和子表达式,以及副作用发生的顺序未指明。在上一个和下一个序列点之间,标量对象应通过对表示此外,先前的值只能访问确定要存储的值。本段的要求对于充分表达;否则行为是未定义的。

如果这使用了A[0]的旧值,那么它应该是未定义的行为,对吗?

是的,它是有效的

首先,在赋值的LHS上读取A[0]是完全有效的,并且定义良好,原因与此相同:

int x = 42;
x = x + 1;

必须先计算两个操作数,然后才能执行赋值。

其次,单独评估A[A[0]]是可以的:

[C++11: 1.9/15]:[..]在运算符的结果的值计算之前对运算符进行排序[..]

在C++03中,我能找到的最相关的措辞是关于赋值的以下内容(尽管在整个gaff中都有a = a + x等结构的例子):

[C++03: 5.17/8]:如果存储在一个对象中的值是从以任何方式与第一个对象的存储重叠的另一个对象访问的,那么重叠应该是精确的,并且两个对象应该具有相同的类型,否则行为是未定义的。