关于C#:我在哪里可以放一个数组下标?


Where can I put an array subscript?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
In C arrays why is this true? a[5] == 5[a]

这个问题问为什么

1
a[5] == 5[a]

除了一个…

为什么允许将数组下标放在整数之后?为什么不允许写

1
[a]5

1
[5]a

或者把EDOCX1[0]放在其他奇怪的地方?

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

编辑一:我收到的引用标准的答案一开始有点难理解。但在急救人员的帮助下,我现在明白了。指针或整数后允许使用数组下标(方括号)。如果它跟在指针后面,括号内的内容必须是整数。如果它跟在一个整数后面,括号内的内容必须是一个指针。

我接受的是不太乐观的回答,因为他在让我理解标准中的引用时做了更多的牵手。但严格引用标准的答案也是正确的。刚开始很难理解。

编辑二:我不认为我的问题是重复的。我的问题是关于数组下标运算符允许的语法。它的回答是引用了标准中从未出现过的问题,我认为是重复的。它是相似的,是的,但不是复制品。


来自C11标准的后缀表达式语法:

1
2
3
4
5
6
7
8
9
10
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标准的主要表达式语法:

1
2
3
4
5
6
primary-expression:
    identifier
    constant
    string-literal
    ( expression )
    generic-selection

等等。5是一个整数常量,因此5[a]与此匹配:

1
postfix-expression [ expression ]

希望这就是你的意思。

编辑:我忘了提这个,但其他评论已经提过了:

其中一个表达式的类型应为"指向完整对象类型的指针",另一个表达式的类型应为表达式应为整数类型,结果的类型为"类型"。

该"整数类型"需要禁止非意义浮点常量订阅。


在C标准的数组订阅运算符部分中定义:

(C99, 6.5.2.1p2)"A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2)))."

关于允许的E1E2类型:

(C99, 6.5.2.1p1)"One of the expressions shall have type ‘‘pointer to object type’’, the other expression shall have integer type, and the result has type ‘‘type’’."


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