2012-11-22 83 views
4

可能重複:
In C arrays why is this true? a[5] == 5[a]
Accessing arrays by index[array] in C and C++不可能的C++數組索引

我剛剛找到了似乎是在我的代碼中的錯誤,但不是唯一的彙編,它也適用如預期最初...

請考慮以下代碼snipet:

#include <string> 
#include <iostream> 
using namespace std; 

class WeirdTest 
{ 
public: 
    int value; 
    string text; 
    WeirdTest() : value(0), 
        text("") 
    {} 
    virtual ~WeirdTest() 
    {} 
    void doWeirdTest() 
    { 
     value = 5; 
     string name[] = 
     { 
      "Zero", 
      "One", 
      "Two", 
      "Three", 
      "Four", 
      "Five" 
     }; 
     text = value[name]; 
     cout << "text: " << text << endl; 
    } 
}; 
int main(int argc, char** argv) 
{ 
    WeirdTest test; 
    test.doWeirdTest(); 
    return 0; 
} 

而不是text=value[name];它應該是text=name[value];但編譯器不會抱怨,並且無論「錯誤」是否存在,生成的二進制代碼都完全相同。 我正在編譯使用g ++ 4.6.3,如果有人知道這裏發生了什麼,我會非常感激。這是否是我錯過的標準?自動錯誤修復在C++ 0x也許? ;)

非常感謝,

乾杯!

+7

它是從C繼承的行爲。請參見:http://www.c-faq.com/aryptr/joke.html – jamesdlin

+2

請參閱http://stackoverflow.com/questions/8969684/accessing-array-contents-xn -vs-nx/8969755#8969755或http://stackoverflow.com/questions/5073350/accessing-arrays-by-indexarray-in-c-and-c – hmjd

回答

9

是的,這是一個奇怪的「功能」。實際上,編譯器會將a[i]轉換爲*(a + i),因此數組索引和數組地址實際上是可以互換的。

請注意,只有在operator []未超載時纔有效。

+1

非常感謝這些答案的傢伙!我今天學到了一些東西:) – Pillard

+0

這個「功能」是混淆C大賽中條目使用的一種標準技巧。 –