这是对序列点之间同一对象的多次访问定义良好的行为
Is this multiple accesses to the same object between sequence points well-defined behavior?
允许多重访问吗?
#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]:
如果存储在一个对象中的值是从以任何方式与第一个对象的存储重叠的另一个对象访问的,那么重叠应该是精确的,并且两个对象应该具有相同的类型,否则行为是未定义的。
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- 在C++中循环访问自定义结构列表的小问题
- 成员访问是否在空指针上定义C++?
- 如何访问宏中定义的数组元素
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 循环访问自定义双链表
- FlatBuffers C++ reinterpret_cast访问实际上是未定义的行为吗?这样做实际上可以吗?
- 错误:未定义对"静脉类型信息::电池访问"的引用
- 有没有办法从Makefile访问VS Code c_cpp_properties.json文件中的定义
- 如何在一个函数中定义一个变量,并在另一个函数中访问和更改它?(C++)
- 访问从联合与另一个成员集复制的联合中的一个成员是否未定义或未指定?
- 为什么c++允许成员函数定义中实例的私有成员访问
- 如何从类中定义的结构访问私有成员?c++
- 威纳派读取自定义文件或文件夹的所有访问权限
- 从模板化类中的子类访问定义
- C++ 访问定义宏数据
- 这是对序列点之间同一对象的多次访问定义良好的行为
- 为什么pre_c_init访问定义的程序段之外的内存
- 如何在c++中访问定义在不同类中的变量
- 如何在多态中访问定义在派生类而不是基类中的函数