This question问为什么
a[5] == 5[a]
除了一个......之外,所有方面都有答案。
为什么一个允许在一个整数之后放置一个数组下标?为什么不允许写一些像
这样的东西[a]5
或
[5]a
或将[]
放在其他奇怪的地方?
换句话说,允许数组索引运算符的定义是什么?
编辑I:我收到的引用标准的答案起初有点难以理解。但在我现在明白的响应者的帮助下。指针或整数后允许使用数组下标(方括号)。如果它跟在指针之后,括号内的内容必须是整数。如果它跟一个整数,括号内的内容必须是指针。
我接受了不那么热烈的答案,因为他让我理解标准中的引用更加谨慎。但严格引用标准的答案也是正确的。起初只是难以理解。
编辑II:我认为我的问题不重复。我的问题是关于数组下标运算符的允许语法。它被标准中的引用所回答,这些引用从未出现在我认为重复的问题中。它是相似的,是的,但不是重复的。
答案 0 :(得分:6)
在C标准的Array下标运算符部分中定义:
(C99,6.5.2.1p2)“后缀表达式后跟方括号[]中的表达式是数组对象元素的下标。下标operator []的定义是E1 [E2]与(*((E1)+(E2)))相同。“
并考虑允许的E1
和E2
类型:
(C99,6.5.2.1p1)“其中一个表达式应具有指向对象类型的''指针'',另一个表达式应具有整数类型,结果的类型为''type''。”
答案 1 :(得分:6)
来自C11标准的后缀表达式语法:
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 ]
希望这就是你的意思。
编辑:我忘记提及这一点,但其他评论已经做过:其中一个表达式的类型''指向完整的对象类型'',另一个 expression应具有整数类型,结果类型为''type''。
那个“整数类型”需要禁止下标非感知浮点常量。
答案 2 :(得分:1)
a[5]
转换为*(a+5)
。加法是可交换的,因此a+5 = 5+a
可以转换回5[a]
。我同意这是一个相当无用的功能,但是,为什么不呢?