2012-01-18 58 views
33

可能重複:
In C arrays why is this true? a[5] == 5[a]這爲什麼有效?不合邏輯的數組訪問

我的一個朋友是學習C++的第一次,送我這個片段:

int foo[] = { 3, 38, 38, 0, 19, 21, 3, 11, 19, 42 }; 
char bar[] = " abcdefghijklmnopqrstuvwxyz-,.!?-_"; 
for (int i = 0; i < 10; ++i) { 
    std::cout << foo[i][bar]; 
} 

在一目瞭然,我告訴他它不會工作 - 我認爲它不會編譯,或者至少會導致訪問衝突,因爲foo不是二維數組,他回答說它是這樣做的。

我爲自己嘗試過,令我驚訝的是,片段運行得非常好。問題是:爲什麼?

根據邏輯,常識和良好的做法,語法應該是bar[foo[i]]

我很慚愧地承認我不知道發生了什麼事。在這種情況下,foo[i][bar]有效的語法是什麼?

+16

這不是一個確切的重複,而且答案很有趣。這兩個問題的根本原因都是一樣的,但對於StackOverflow上的數百個問題,情況確實如此。 – 2012-01-18 13:33:46

+1

順便說一句:我只會同意輸出,如果我會做這些事情... – stefaanv 2012-01-18 16:06:27

+0

有趣的是,這個實際上是有道理的,如果一個人讀取鏈接的問題,但仍然完全不合邏輯,因爲它是當你不'不懂;不合邏輯的部分只是從「這項工作如何」轉變爲「他們爲什麼要讓這項工作」。 – 2016-12-31 18:36:30

回答

35

在簡單術語中,陣列元件的在C訪問(在C++中,當[]未過載)如下:

x[i] = *(x + i) 

所以,與此和算術的一點點。 ..

foo[i][bar] 
= (foo[i])[bar] 
= (*(foo + i))[bar] 
= *((*(foo + i)) + bar) 
= *(bar + (*(foo + i))) 
= bar[*(foo + i)] 
= bar[foo[i]] 

雖然不要使用這個「事實」。正如你所看到的,它使得代碼不可讀,而不可讀的代碼是不可維護的。

相關問題