2017-02-20 83 views
-7

好吧,所以我知道这是非常基本的,但我很困惑。当我运行这段代码:为什么添加x + 1跳过10?

int main(){ 
int arr[10]; 
for (int x = 1; x < 11; x++){ 
    arr[x] = x + 1; 
    cout<< arr[10]; 
    } 
} 

输出是1,2,3,4,5,6,7,8,9,11。

为什么它打印11而不是10年???

+7

程序具有不确定的行为,因为它读取未初始化的数据和,因为它执行出来的数组越界访问。不过,一本基础教科书应该教你如何在C++中工作。 –

+2

好吧,你似乎每次都会打印'arr [10]',而不是你刚分配的值,而'arr [10]'超出范围。什么事情都可能发生。 (你最后还要写'arr [10]'。) – Ryan

+0

你只输出数组中的第10项。 –

回答

0

你周围的循环,每次打印arr[10]arr[10]超出限制,所以你的程序有未定义的行为。为什么未定义的行为会像它一样行事?可能的解释是,你的程序在这种情况下被编译,从而arr[9]后堆栈中的下一个值是x,你增量从1到10,因此你的程序分配给arr[x]偏偏打印x的变量(是超出界限访问arr[10]读取的)前9次迭代。在第十次迭代中,它将11分配给arr[10]并打印。

+0

那么我需要做什么才能打印1-10? – Corpse

+0

@Corpse:取而代之,从0到9(数组索引,“x = 0; x <10”)循环,而不是'arr [10]'打印'arr [x]'? – Ryan

+0

谢谢大声笑我知道了 – Corpse

0

如果您创建一个这样的数组:int arr[10],那么由于基于0的编号,您可以访问以下元素:arr[0], arr[1], ... arr[8], arr[9]。你的程序试图访问超出此范围的元素arr[10],所以这在未定义的行为。