为什么对于每个数组 a 和整数 j,a[j] 等于 j[a]
Why is a[j] equal to j[a] for every array a and integer j?
我正在阅读"c ++编程语言"中有关指针和数组的部分,我遇到了一些难倒我的东西。
对于
a
范围内的每一个内置数组a
和整数j
,我们 有:
a[j] == *(&a[0]+j) == *(a+j) == *(j+a) == j[a]
我理解为什么*(&a[0]+j)
的意思与a[j]
相同,因为&a[0]
指向a
的第一个元素,然后递增j
。
我还得到*(a+j)
和*(j+a)
等于 a[j]
,a 从数组隐式转换为指向 a 的第一个元素的指针,然后递增 j 并取消引用。
但为什么a[j] == j[a]
呢?我错过了什么?
因为下标运算符是可交换的。它只是由语言指定为如此。
您可以从与指针算术表达式的等价性中看到对称性,其中加法运算符也是可交换的:
a[j] == ∗(a+j)
j[a] == ∗(j+a)
∗(a+j) == ∗(j+a)
语言标准(草案(说:
[分项]
。表达式 E1[E2] 与 *((E1(+(E2(( 相同(根据定义(...
[注意:尽管外观不对称,但下标是除排序之外的交换操作。
相关文章:
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 复制 std::vector,但将 lambda 应用于每个元素
- 将二进制操作员应用于数组中的每个元素
- 如何将比较运算符应用于两个匿名结构中的每个变量
- 我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 Op
- 是否可以将std ::函数应用于特征矩阵的每个元素
- 将相同的功能应用于不同大小的N数组的每个元素
- 将函数应用于元组的每个元素
- 将功能应用于图像的每个像素
- 如何将函数应用于可变参数列表的每个组件并返回可变参数列表
- 将功能应用于数组中的每个元素
- 将多态函数应用于每个元组元素的结果类型
- 以错误的顺序将函数应用于参数包中的每个元素
- 如何检查c++stl向量中是否存在值,并将函数应用于向量的每个元素
- 拥有特定于实例的io_service、解析器等可以 VS 在每个函数中创建它们
- 将函数应用于参数包的每个元素的语言功能
- 为什么字符串中的每个字符都不等于等效字符
- 如何有效地设计一种方法,使每个条件都依赖于另一个条件
- 删除 [] 是否等于每个元素删除.C++