2013-02-18 39 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一個更好的解釋。