预期输出之后的所有这些数字是多少

What are all of these numbers following the expected output?

本文关键字:数字 多少 所有这些 输出 之后      更新时间:2023-10-16

我正试图编写一个程序来接受一个输入并以该输入的相反方向输出;这是我的代码:

#include <iostream>
using namespace std;

int main() {
int n;
cin >> n;
int num[n];
for (int i=1; i<=n; i++)
{
cin >> num[i];
}
for (int i=n; i>=0; i--)
{
cout << num[i] << " ";
}
return 0;
}

我意识到在第二个for循环中,i可以等于0,然后i等于-1。然而,这些输出并没有真正意义。例如,的输入

6
8 1 2 6 3 9

中的结果

9 3 6 2 1 8 8 8

很多时候,它只是颠倒了数组,但在末尾添加了8,但有时也有以下类型的数字:

9
1 0 2 8 1 4 2 9 8
8 9 2 4 1 8 2 0 1 1703936

这些尾数是从哪里来的?因为我不明白发生了什么,我无法概括问题是什么,但如果你附近有一个易于访问的IDE,并将复制和粘贴我的代码(假设这不是一个众所周知的问题,我让每个人都嘲笑我的愚蠢(,有人能告诉我为什么会在末尾添加这些数字吗?

for (int i=1; i<=n; i++)

在C++中,数组索引为0索引。这意味着,如果数组大小为n,则有效索引为0, 1, 2, ..., n-1

您的循环将在1, 2, 3, ..., n上循环。你看到问题了吗?您从不写入第0个索引,而是在最后一个索引之后写入一个索引(这是不允许的(。

然后当你去打印:

for (int i=n; i>=0; i--)

打印n, n-1, n-2, ..., 0。您正在打印第n个元素,这也是不允许的。

相反,你的循环应该看起来像:

for (int i=0; i<n; i++)
{
cin >> num[i];
}
for (int i = 0; i < n; i++)
{
cout << num[n - i - 1] << " ";
}

第二个循环以i等于n开始。。。但这不是有效的数组索引,因为包含n元素的数组具有索引[0..n-1]!因此,您看到的是"内存垃圾">

所以,你的第二个循环应该是:

for (int i=n-1; i>=0; i--)

您似乎认为数组是从1开始索引的,这是您的主要问题。

for (int i=1; i<=n; i++)

数组的最后一个元素是length-1,所以如果有3个元素,最后一个索引是2,而不是3;然而,上面的循环从1(第二个元素(开始,然后访问超出界限的索引,这是未定义的行为。

但实际上您根本不需要使用索引,只需for (auto& i : n)就可以在容器上正确迭代。如果你想使用索引循环,你需要

for (int i = 0; i < n; i++) // forwards 
for (int i = n-1; i >= 0; i--) //backwards

值得注意的是,可变长度数组(即在编译时长度未知的数组(不是标准C++,而是GCC的扩展。现在应该放弃这种行为,转而使用vector

int length = 0;
std::cin >> length;
std::vector<int> n(length);