Where can I put an array subscript?
Possible Duplicate:
In C arrays why is this true? a[5] == 5[a]
号
这个问题问为什么
除了一个…
为什么允许将数组下标放在整数之后?为什么不允许写
号
或
或者把EDOCX1[0]放在其他奇怪的地方?
换句话说,数组索引运算符的允许位置定义是什么?
编辑一:我收到的引用标准的答案一开始有点难理解。但在急救人员的帮助下,我现在明白了。指针或整数后允许使用数组下标(方括号)。如果它跟在指针后面,括号内的内容必须是整数。如果它跟在一个整数后面,括号内的内容必须是一个指针。
我接受的是不太乐观的回答,因为他在让我理解标准中的引用时做了更多的牵手。但严格引用标准的答案也是正确的。刚开始很难理解。
编辑二:我不认为我的问题是重复的。我的问题是关于数组下标运算符允许的语法。它的回答是引用了标准中从未出现过的问题,我认为是重复的。它是相似的,是的,但不是复制品。
- 因为C标准明确表示E1[E2]与*(E1+E2)相同,+是交换算子。
- 这个问题回答了您的问题:"换句话说,数组索引运算符的允许位置定义是什么?"在C语言编程语言中(又称:k&r)"。
- 我不太明白答案。例如,我可以合法地写7.3[b]吗?如果没有,为什么不呢?
- @johnfitzpatrick数组下标和所有指针算术都是用整数完成的,如果你想到它,在那里使用非整数是毫无意义的。您处理的是整数值,而不是小数,比如1/10位。
- @johnfitzpatrick不可以,如果+的一个操作数是指针,另一个应该是整数类型。不过,((int)7.3)["Harr Harr"]应该可以工作。
- @m0skit0 C编程语言由标准定义,而不是由K&R定义。
- @丹尼尔菲舍尔:完全正确,但标准是基于K&R
- @Alexeyfrunze谢谢。好的,所以不允许非整数后面跟方括号。结构呢?我想我在找方括号的定义。
- @从宽松的意义上讲,我是在滑雪。自K&R以来,它有了很大的发展。
- @丹尼尔菲舍尔,仁慈的上帝。我今天甚至都不打算去抓`((int)7.3)`["Harr Harr"]`。但谢谢你的思想食物…
- @johnfitzpatrick如何向指针或整数添加结构?从什么意义上说?您将使用它的大小、地址、对齐方式、其中的字段数,什么?
- @我不想向指针或整数添加结构。我想知道在我的代码中哪里可以合法地放一个方括号。
- @约翰菲茨帕特里克,那你最好给自己一份C标准。或者至少有一张免费的汇票。真的,你可以无限期地问这样的问题,但为什么呢?只需阅读标准。如果你在里面找不到什么,就回来。
- 它实际上是在你连接的那个问题上的答案,你只需要知道交换算符是什么。问这个问题也许会是个更好的问题。我投票决定结束这件事。
- @伦丁,谢谢。实际上,我掌握了通勤性部分。令我不安的是,我总是假设方括号必须跟随某种指针。5不是指针。但有些答案似乎引导我去研究后缀表达式的概念。
- @Alexeyfrunze谢谢。我理解你对阅读标准的看法。但我经常只使用C语言,对于像我这样的业余爱好者来说,这个标准很难掌握。这些年来,我读过几本C语言的书,从来没有遇到过方括号后面跟任何不是指针的东西。所以,我觉得有必要在这里问那些已经阅读并理解了标准的人在哪里能有所帮助。谢谢你。
- @约翰菲茨帕特里克很抱歉没有弄清楚这个问题。你对索引这方面的兴趣并不完全明显。我将撤销-1如果你编辑的问题不知何故,也许添加一个消歧。在编辑问题之前无法执行此操作。
- @阿列克谢·弗伦兹,我曾试图消除歧义。
- 那没什么用。你也应该把[E1]E2扔进去。
- @Alexeyfrunze请随意编辑。我想你理解我的要求,我希望这篇文章有意义。
- 为什么问题已经解决了?我不认为这是复制品,"可能的复制品"解释了为什么5[a]和A[5]是相同的假设5[a]是允许的,而不是为什么5[a]是允许的。即使加法是交换的,如果语法中不包含这个形式,它也不被允许,所以"a+5==5+a"并不能真正回答这个问题。
来自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 ] |
希望这就是你的意思。
编辑:我忘了提这个,但其他评论已经提过了:
其中一个表达式的类型应为"指向完整对象类型的指针",另一个表达式的类型应为表达式应为整数类型,结果的类型为"类型"。
该"整数类型"需要禁止非意义浮点常量订阅。
- 是的,多亏了你和啊,我现在明白了我需要掌握一个后缀表达式的概念。我去学习…
- 我暂时不能接受你的回答,因为我不明白为什么你上面提到的语法中,7.3[5]不是一个有效的表达。7.5是一个常数,因此是一个主要表达。那么,标准中怎么说它不能跟方括号呢?
- 我写的,这是标准的最后一个报价。不仅有语法,还有标准中的"约束"。如我所写:"其中一个表达式应具有类型‘指向完整对象类型的指针’,另一个表达式应具有整数类型";7.2既不是整数也不是指针,它是浮点常量,因此对于数组下标运算符来说,它不是有效的后缀表达式。约束是"限制,无论是句法的还是语义的,通过它来解释语言元素的解释"。
- 好的,好的,现在我明白了。我有点慢。e1和e2必须是一个指针和一个按任意顺序排列的整数。谢谢你的耐心。
在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)))."
号
关于允许的E1和E2类型:
(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’’."
号
- 但这并没有说明[E1]E2也是有效的,这实际上是个问题。
- @m0skit0:由于e1和e2是自由变量,因此它们是可互换的。
- @m0skit0手术没有问到[E1]E2!
- 表达式是可互换的,但不是符号。@Alexeyfrunze:"换句话说,数组索引运算符的允许位置定义是什么?"
- @m0skit0 c99,6.5.2c1:postfix-expression [ expression ]怎么样?
a[5]翻译成*(a+5)。加法是交换的,所以a+5 = 5+a可以翻译回5[a]。我同意这是一个相当无用的功能,但见鬼,为什么不呢?
- 当然是*(a + 5)。
- @Dietrichepp脑残。