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

lbsnaicq  于 2023-11-17  发布在  其他
关注(0)|答案(3)|浏览(75)

This question问为什么:

a[5] == 5[a]

字符串
它在所有方面都得到了回答,除了一个...
为什么一开始就允许在整数后面放一个数组下标?为什么不允许写这样的东西:

[a]5


或者:

[5]a


或者把[]放在其他奇怪的地方?
换句话说,数组索引运算符允许的位置的定义是什么?

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

nzrxty8p

nzrxty8p1#

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 ]


希望这就是你的意思。
编辑:我忘了提到这一点,但其他评论已经这样做了:

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

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

yks3o0rb

yks3o0rb2#

在C标准的数组下标运算符部分定义如下:
(C99,6.5.2.1p2)“后缀表达式后跟方括号中的表达式[]是数组对象元素的下标指定。下标运算符[]的定义是E1[E2]等同于(*((E1)+(E2)。”
关于E1E2的允许类型:
(C99,6.5.2.1p1)“其中一个表达式应具有类型”指向对象类型的指针“,另一个表达式应具有整数类型,并且结果具有类型”类型“。”

zxlwwiss

zxlwwiss3#

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

相关问题