为什么每个数组a和整数j的a [j]等于j [a]?

时间:2019-06-01 23:34:07

标签: c++ arrays c++11 pointers

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

  

对于pgm.createExtension('uuid-ossp', { ifNotExists: true }); // and pgm.createTable('my_table', { id: { type: 'uuid', primaryKey: true, default: new PgLiteral('gen_random_uuid()') }, // ... 范围内的每个内置数组a和整数j,我们   有:

     

a

我理解为什么a[j] == *(&a[0]+j) == *(a+j) == *(j+a) == j[a]的含义与*(&a[0]+j)相同,因为a[j]指向&a[0]的第一个元素,然后又递增a。 / p>

我还得到j*(a+j)等于*(j+a),a被隐式地从数组转换为指向a的第一个元素的指针,然后递增j并取消引用。

但是为什么a[j]呢? 我想念什么?

1 个答案:

答案 0 :(得分:2)

因为下标运算符是可交换的。只是通过语言将其指定为是如此。

从与指针算术表达式的等价关系中可以看到对称性,其中加法运算符也是可交换的:

a[j] == ∗(a+j)
j[a] == ∗(j+a)
∗(a+j) == ∗(j+a)

语言标准(草稿)说:

  

[expr.sub]

     

...表达式E1 [E2](根据定义)与*((E1)+(E2))...

     

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