为什么我在索引 0 处得到垃圾值

Rag*_*oel 3 c++

#include <iostream>
using namespace std;
int main()
{
    int arr[8];
    int n = 0;
    while (n < 8)
    {
        arr[n] = ++n;
    }
    for (n = 0; n < 8; n++)
    {
        cout << arr[n]<<" ";
    }
}
Run Code Online (Sandbox Code Playgroud)

产出-垃圾 1 2 3 4 5 6 7 预期产出- 1 2 3 4 5 6 7 8

120*_*arm 7

该语句arr[n] = ++n;具有未定义的行为,因为它n在用作 中的下标之前是否递增是未指定的arr

在您的情况下,对于您的编译器,增量首先发生,因此您永远不会向数组末尾分配任何内容并写入数组arr[0]末尾。arr[8]

解决这个问题的一种方法是将其分成两个语句:

arr[n] = n;
++n;
Run Code Online (Sandbox Code Playgroud)

评估顺序称为排序,并且规则随着语言的发展而变化。重要的是,对于 C++17, 的增量n将在计算存储结果的地址之前发生,因此您总是会得到未初始化的第一个元素并且写入超出了数组的末尾。