我可以在哪里放置数组下标?
可能重复:
在C数组中,为什么这是真的? a [5] == 5 [a]
这个问题问为什么
a[5] == 5[a]
它在所有方面都有答案,只有一个...
为什么有人允许在一个整数之后放置一个数组下标? 为什么没有人允许写类似的东西?
[a]5
要么
[5]a
或把[]
放在其他奇怪的地方?
换句话说,数组索引操作符的定义是什么?
编辑我:我收到的答案引述标准有点难以理解。 但在现在我明白的反应者的帮助下。 在指针或整数之后允许数组下标(方括号)。 如果它跟随一个指针,那么括号内的内容必须是一个整数。 如果它跟随一个整数,括号内的内容必须是一个指针。
我正在接受较少回复的答案,因为他让我更了解了标准中的引用。 但严格引用标准的答案也是正确的。 一开始就很难理解。
编辑二:我不认为我的问题是重复的。 我的问题是关于数组下标运算符的允许语法。 这是从标准引用回答,从来没有出现在我认为重复的问题。 它是类似的,是的,但不是重复的。
来自C11标准的Postfix表达语法:
postfix-expression:
primary-expression
postfix-expression [ expression ]
postfix-expression ( argument-expression-listopt )
postfix-expression . identifier
postfix-expression -> identifier
postfix-expression ++
postfix-expression --
( type-name ) { initializer-list }
( type-name ) { initializer-list , }
来自C11标准的主要表达语法:
primary-expression:
identifier
constant
string-literal
( expression )
generic-selection
等等。 5是一个整数常量,所以5 [a]匹配这个:
postfix-expression [ expression ]
希望这是你的意思。
编辑:我忘了提到这一点,但其他意见已经做到了:
其中一个表达式应该有'指向完整对象类型'的指针,另一个表达式应该是整数类型,结果的类型是''type''。
这是'整数类型',它需要禁止无意义的浮点常量下标。
在C标准的数组下标运算符部分定义在这里:
(C99,6.5.2.1p2)“一个后缀表达式,后跟一个用方括号[]表示的表达式,是数组对象元素的下标,下标运算符[]的定义是E1 [E2]与(*((E1)+(E2)))“。
关于E1
和E2
的允许类型:
(C99,6.5.2.1p1)“其中一个表达式应该有''指向对象类型的指针'',另一个表达式应该是整数类型,结果的类型是''type''。”
a[5]
转换为*(a+5)
。 加法是可交换的,所以a+5 = 5+a
,可以翻译回5[a]
。 我同意这是一个相当无用的功能,但是地狱,为什么不呢?