我正在阅读“ 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]
呢?
我想念什么?
答案 0 :(得分:2)
因为下标运算符是可交换的。只是通过语言将其指定为是如此。
从与指针算术表达式的等价关系中可以看到对称性,其中加法运算符也是可交换的:
a[j] == ∗(a+j)
j[a] == ∗(j+a)
∗(a+j) == ∗(j+a)
语言标准(草稿)说:
[expr.sub]
...表达式E1 [E2](根据定义)与*((E1)+(E2))...
[注意:尽管下标外观不对称,但除排序外,下标是可交换的操作。