4

可能重复:
在 C 数组中,为什么这是真的?a[5] == 5[a]

这个问题问为什么

a[5] == 5[a]

它在所有方面都得到了回答,除了...

为什么首先允许在整数之后放置数组下标?为什么不允许写类似的东西

[a]5

或者

[5]a

还是放在[]其他奇怪的地方?

换句话说,允许数组索引运算符的定义是什么?

编辑 I: 我收到的引用标准的答案起初有点难以掌握。但在响应者的帮助下,我现在明白了。在指针或整数之后允许使用数组下标(方括号)。如果它跟随一个指针,那么括号内的内容必须是一个整数。如果它跟随一个整数,那么括号内的内容必须是一个指针。

我接受了不那么赞成的答案,因为他在让我理解标准引用方面做了更多的帮助。但是严格引用标准的答案也是正确的。只是一开始更难理解。

编辑二: 我不认为我的问题是重复的。我的问题是关于数组下标运算符的允许语法。它是由标准中的引用来回答的,这些引用从未出现在我应该重复的问题中。它是相似的,是的,但不是重复的。

4

3 回答 3

6

在此处 C 标准的数组下标运算符部分定义:

(C99, 6.5.2.1p2) "后缀表达式后跟方括号 [] 中的表达式是数组对象元素的下标指定。下标运算符 [] 的定义是 E1[E2] 等同于(*((E1)+(E2)))。”

以及关于 and 的允许E1类型E2

(C99, 6.5.2.1p1)“其中一个表达式应具有类型''指向对象类型的指针'',另一个表达式应具有整数类型,并且结果具有类型''type''。”

于 2012-10-22T19:16:34.550 回答
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 ]

希望这就是你的意思。

编辑:我忘了提到这一点,但其他评论已经做了:

其中一个表达式应具有类型“指向完整对象类型的指针”,另一个表达式应具有整数类型,并且结果具有类型“类型”。

需要这种“整数类型”来禁止无意义的浮点常量下标。

于 2012-10-22T19:28:06.007 回答
1

a[5]转换为*(a+5)。加法是可交换的,所以a+5 = 5+a可以翻译回5[a]。我同意这是一个相当无用的功能,但是地狱,为什么不呢?

于 2012-10-22T19:16:48.720 回答