我在哪里可以放一个数组下标?

时间:2012-10-22 19:13:22

标签: c

  

可能重复:
  In C arrays why is this true? a[5] == 5[a]

This question问为什么

a[5] == 5[a]

除了一个......之外,所有方面都有答案。

为什么一个允许在一个整数之后放置一个数组下标?为什么不允许写一些像

这样的东西
[a]5

[5]a

或将[]放在其他奇怪的地方?

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

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

我接受了不那么热烈的答案,因为他让我理解标准中的引用更加谨慎。但严格引用标准的答案也是正确的。起初只是难以理解。

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

3 个答案:

答案 0 :(得分:6)

在C标准的Array下标运算符部分中定义:

  

(C99,6.5.2.1p2)“后缀表达式后跟方括号[]中的表达式是数组对象元素的下标。下标operator []的定义是E1 [E2]与(*((E1)+(E2)))相同。“

并考虑允许的E1E2类型:

  

(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]。我同意这是一个相当无用的功能,但是,为什么不呢?