2013-02-18 82 views
4

以下代码差[10]和10 [A]

a[10] == 10[a]

结果似乎true在C语言

C编译器如何看待它们两者为相同的?

+0

您确定吗?或者你只是要求访问数组的一个元素,而不是定义一个元素。 – 2013-02-18 09:46:35

+1

[编译错误](http://liveworkspace.org/code/33824t$0) – 2013-02-18 09:48:22

+1

答案已经告诉你为什么会出现这种情况(因为数组降级为指针),但是你应该注意到** 10 [a]是非常糟糕的做法**,因为它没有传达意图,它只是语法混淆了你的代码的读者。实际上客观上语法较差,因为在索引上的算术比基于数组的算术更加频繁,并且[2 * x]比(2 * x)[a]短。 – 2013-02-18 09:52:56

回答

2

a [10]表示:“从内存地址10开始,向其中添加一个并引用结果位置” 10 [a]表示:“从内存地址a开始,向其中添加10并引用结果位置“

由于+ 10与10 + a相同,因此这两个表达式都会引用相同的内存位置。

+1

我认为你把第一句话倒退了 – StoryTeller 2013-02-18 10:01:08

+0

错了。第一个句子的意思是'10 + a * sizeof(a [i])',而第二个意思是'a + 10 * sizeof(a)',当sizeof(a)不是1时明显错误。只适用于'char *'之类的 – 2013-12-17 11:41:57

6

编译器看到如下:

a[10] == *(a + 10) == *(10 + a) == 10[a] 

检查this一个更好的解释。