c++ - 为什么对于每个数组 a 和整数 j,a[j] 都等于 j[a]?

标签 c++ arrays c++11 pointers

<分区>

我正在阅读“C++ 编程语言”中有关指针和数组的部分,我遇到了一些让我感到困惑的事情。

For every built-in array a and integer j within the range of a, we have:

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)

语言标准(草案)说:

[expr.sub]

... The expression E1[E2] is identical (by definition) to *((E1)+(E2)) ...

[Note: Despite its asymmetric appearance, subscripting is a commutative operation except for sequencing.

关于c++ - 为什么对于每个数组 a 和整数 j,a[j] 都等于 j[a]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56411168/

相关文章:

c++ - Boost 多精度舍入模式

c++ - 我们可以得到两个输入之间的时间吗?

python - 在 Python 中插值 3d 数组。如何避免for循环?

javascript - Reactjs: TypeError: 无法读取未定义的属性 'eventSlots'

c++ - enable_if 有条件地包含成员函数

c++ - 为什么要为 "copy on write"的 const 成员函数返回一个代理类?

c++ - 如何处理自定义输出运算符中的 iomanips?

c++ - 填充字符串数组或 char* 数组的问题

VS 2013 中的 C++ 11 lambda 回调无法编译

C++ 停止预处理器宏扩展