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

可能重复:
在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)))“。

关于E1E2的允许类型:

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


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

链接地址: http://www.djcxy.com/p/86729.html

上一篇: Where can I put an array subscript?

下一篇: Does this C++ code produce an undefined behavior?