prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 6.11

Q我偶然看到了一些包含“表达式”的“玩笑”代码5["abcdef"]这怎么会是合法的 C 代码?


A是的,弗吉尼亚,在C语言中,数组下标是可交换的。[脚注]这个奇特的现象源于数组下标的指针定义,即a[e]等同于*((a)+(e)),对于任意两个表达式ae,只要其中一个是作为指针的表达式,另一个是作为整数的表达式。其“证明”如下:

	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


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管