对于数组,为什么会出现[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
)。 同样,如果C
为1
,则可以获得不同的汇编级别优化,并且开发人员必须再次明确说明,因为编译器不会识别它。 (最近编译器也这样做,因此这些语法在很大程度上是不必要的)
上一篇: 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