我正在阅读“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的第一个元素的指针,然后由j递增并取消引用。
但是为什么是a[j] == j[a]呢?我遗漏了什么?
发布于 2019-06-01 23:41:07
因为下标运算符是可交换的。语言只是简单地说明了这一点。
从与指针算术表达式的等价性中可以看出对称性,其中加法运算符也是可交换的:
a[j] == ∗(a+j)
j[a] == ∗(j+a)
∗(a+j) == ∗(j+a)语言标准(草案)规定:
expr.sub ..。E1E2的表达式(定义上)与*((E1)+(E2))相同. [注意:尽管订阅的外观不对称,但除了顺序之外,订阅是一种交换操作。
https://stackoverflow.com/questions/56411168
复制相似问题