对于数组,为什么会出现[5] == 5 [a]?

正如Joel在Stack Overflow podcast#34中指出的那样,在C编程语言(aka:K&R)中,提到了C: a[5] == 5[a]

乔尔说这是因为指针算术,但我仍然不明白。 为什么a[5] == 5[a]


C标准定义[]运算符如下:

a[b] == *(a + b)

因此a[5]将评估为:

*(a + 5)

5[a]将评估为:

*(5 + a)

a是指向数组的第一个元素的指针。 a[5]是距a更远的5个元素的值,与*(a + 5) ,并且从小学数学我们知道这些数学是相等的(加法是可交换的)。


因为数组访问是根据指针定义的。 a[i]被定义为意味着*(a + i) ,它是可交换的。


而且当然

 ("ABCD"[2] == 2["ABCD"]) && (2["ABCD"] == 'C') && ("ABCD"[2] == 'C')

主要原因是在70年代C设计时,计算机没有太多的内存(64KB很多),所以C编译器没有做太多的语法检查。 因此,“ X[Y] ”被相当盲目地翻译成“ *(X+Y)

这也解释了“ += ”和“ ++ ”语法。 “ A = B + C ”形式的所有内容都具有相同的编译形式。 但是,如果B与A相同,则可以实现装配级别优化。 但是编译器不够明白,所以开发人员必须( A += C )。 同样,如果C1 ,则可以获得不同的汇编级别优化,并且开发人员必须再次明确说明,因为编译器不会识别它。 (最近编译器也这样做,因此这些语法在很大程度上是不必要的)

链接地址: http://www.djcxy.com/p/2485.html

上一篇: With arrays, why is it the case that a[5] == 5[a]?

下一篇: Fastest way to determine if an integer's square root is an integer