2013-11-03 60 views
0

爲什麼這...for循環打印的,而不是我數組值

int a[5]; 
a[-2] = 1; 
a[-1] = 2; 
a[0] = 3; 
a[1] = 4; 
a[2] = 5; 

cout << a[-2] << endl <<endl; 

for(int i=-2 ; i<=2 ; i++) 
{ 
    cout << a[i] << endl; 
} 

...輸出呢?

1 

-2 
2 
3 
4 
5 

我創建的代碼塊,編譯另一個項目文件,並得到這個

1 

1 
-1 
3 
4 
5 

我試圖找到類似的問題的帖子,但我不能找到任何。 這只是沒有道理給我

+3

世界由**未定義行爲** ..一個*神奇*地方道路。 – WhozCraig

回答

3

C++訪問陣列使用負指數是undefined behavior,對於有效的索引:

int a[5]; 

0 to 4

如果我們看一下在C++草案標準部8.3.4陣列段說:

[...]如果常量表達式的值是N,所述陣列具有N個元件編號爲0至N-1,[...]

2

您的代碼具有未定義行爲:-2是不是一個有效的索引int[5]陣列。有效索引到這種陣列是0到4

在此特定情況下,它只是恰巧,由事故,即i位於存儲器正好的a第一元件下方的偏移2 * sizeof(int),所以a[-2]恰好是爲i的別名。