Q我偶然看到了一些包含“表达式”的“玩笑”代码5["abcdef"]这怎么会是合法的 C 代码?
A是的,弗吉尼亚,在C语言中,数组下标是可交换的。[脚注]这个奇特的现象源于数组下标的指针定义,即a[e]等同于*((a)+(e)),对于任意两个表达式a和e,只要其中一个是作为指针的表达式,另一个是作为整数的表达式。其“证明”如下:
a[e] *((a) + (e)) (by definition) *((e) + (a)) (by commutativity of addition) e[a] (by definition)
这种出乎意料的可交换性经常在C语言书籍中被提及,仿佛是值得骄傲的事情,但除了混淆C语言竞赛(参见问题20.36)之外,并没有实际的应用。
由于C语言中的字符串是由char组成的数组,因此表达式"abcdef"[5]是完全合法的,并且求值为字符'f'。你可以将其视为一种简写方式,表示
char *tmpptr = "abcdef"; ... tmpptr[5] ...参见问题20.10,其中有一个实际的例子。
参考文献:Rationale Sec. 3.3.2.1
H&S Sec. 5.4.1 p. 124, Sec. 7.4.1 pp. 186-7