2013-11-03 35 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的别名。