for循环打印i而不是数组值

时间:2013-11-03 18:25:09

标签: c++ arrays for-loop codeblocks

为什么会......

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

我在codeblocks中创建了另一个项目文件,编译并获得了这个

1

1
-1
3
4
5

我试图找到有类似问题的帖子,但我找不到。 这对我来说没有意义

2 个答案:

答案 0 :(得分:3)

使用负索引访问 C ++ 中的数组是undefined behavior,有效索引为:

int a[5];

将是0 to 4

如果我们查看 1 段落中的C ++标准草案8.3.4 Arrays 草案:

  

[...]如果常量表达式的值为N,则该数组具有N个元素,编号为0到N-1,[...]

答案 1 :(得分:2)

您的代码显示未定义的行为:-2不是int[5]数组的有效索引。这种数组的有效索引是0到4。

在这种特殊情况下,偶然发生i位于内存中的2 * sizeof(int)正好位于a的第一个元素之下,所以{{1}恰好是a[-2]的别名。