为什么对于每个数组 a 和整数 j,a[j] 等于 j[a]

Why is a[j] equal to j[a] for every array a and integer j?

本文关键字:等于 于每个 数组 为什么 整数      更新时间:2023-10-16

我正在阅读"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(( 相同(根据定义(...

[注意:尽管外观不对称,但下标是除排序之外的交换操作。