2015-12-14 51 views
10

我在網上遇到這個問題,想知道是否有人可以解釋這個,或者至少給我一個可能的名字,這樣我至少可以知道我在用谷歌搜索對於。C++反向索引器和數組的名稱

int main() 
{ 
    int myarray[4] = {0, 100, 200, 300}; 
    2[myarray] = -999; //why does this work? what is this called? 

    for (int i = 0; i < 4; i++) 
     cout << myarray[i] << endl; 
} 

輸出爲0,100,-999,300

我已經跑了。我知道它有效,但爲什麼?這個叫什麼?

+0

它被稱爲與K&R C的愚蠢復古兼容性。 – YSC

回答

8

這是這種情況的原因是因爲arr[n] == *(arr + n)

但是,因爲加法是可交換的,所以*(arr + n) == *(n + arr)。因此,*(n + arr) == n[arr] == *(arr + n) == arr[n]

可能值得一提的是*(arr + n)還是有點誤導。在彙編中,它實際上意味着*(arr + (n * s))其中ssizeof arr[0],但這是在封面下,所以你不必擔心它。

+0

回到當天,當我自己學習C時,很少有人提到*'s'是'sizeof arr [0]'*,好的你加了它在:) – nonsensation

3

我不認爲這個指針算術規則的特定[ab-]使用有任何特定的名稱。它只是在C和C++中定義指針運算的方式而已。兩種語言標準都沒有做出任何特殊的嘗試來防止下標和指針的逆轉。例如,相關的C++規則在5.2.1 [expr.sub]第1段中:

後綴表達式後面跟着方括號中的表達式是後綴表達式。其中一個表達式的類型應該是「T的數組」或「指向T的指針」,而另一個表達式應該是非範型的枚舉或整型。結果是類型「T」。類型「T」應該是完全定義的對象類型。表達式E1 [E2]與*((E1)+(E2))是相同的(根據定義)[注意:有關*和+的詳細信息,請參閱5.3和5.7;有關數組的詳細信息,請參閱8.3.4。除了在數組操作數的情況下,如果該操作數是左值,則結果是左值,否則是左值。

可能工作找人「C++ 5.2.1」或「C++ [expr.sub]」,但使用反轉的不超過混亂的人誰沒有看起來足夠長的大在C或C++。