为什么这个程序打印58684322800B5FD80

Why does this program print -58684322800B5FD80?

本文关键字:打印 58684322800B5FD80 程序 为什么      更新时间:2023-10-16
#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
int x[3];
int i;
int pause;
for (i = 0; x[i] < 10; i++); {
x[i] *= x[i];
cout << x[i];
}
cout << x;
cin >> pause;
return 0;
}

我做错了什么?

不应该打印吗:

16
25
36
{16, 25, 36}

我对C++还很陌生,所以我可能误用了一个循环。

感谢

您需要初始化数组内容。编译器不会为你做这件事。

即便如此,您也需要将它们初始化为零以外的值,否则循环将永远不会终止。

您的算法也容易受到在数组边界之外写入的攻击。你确定我永远不会大于2吗?我不是。

最后,由于指针衰减,cout调用将输出x的第一个元素的地址。要输出实际元素,请使用x[i]或类似方法。

读取/写入未初始化的变量将产生未定义的行为。

在您的情况下,您应该在使用阵列之前对其进行初始化。

int x[3] = {4, 5, 6};

同样,这不是如何迭代数组元素:

for (i = 0; x[i] < 10; i++);{}

上面应该检查i是否小于数组的大小(3)而不是值10。

还要删除分号;,因为在代码中不会发生迭代,并且for loop下面的正文将执行一次。

所以你的代码看起来像:

int x[3] = {4, 5, 6};
for (int i = 0; i < 3; i++) {
x[i] *= x[i];
std::cout << x[i];
}
std::cin.get();
  • 正如我在上面猜测的那样,根据您想要的输出和循环的目的,我用值填充了数组:4, 5, 6

  • 此外,您不应该以这种方式打印数组的元素:

    std::cout<lt;x;

在上面,它将只打印第一个元素x[0]的地址,因为数组的名称将衰减为指向其第一个元素(元素0)的指针。

std::cout << *x; // will print 16 (4 * 4). Which is the first element.

要打印或分配所有元素,请使用迭代:

for(int i(0); i < 3; i++)
std::cout << x[i] << ", ";

您必须初始化您的数组。不为局部变量执行默认初始化。这就是它打印垃圾值的原因。