为什么这个程序打印58684322800B5FD80
Why does this program print -58684322800B5FD80?
#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] << ", ";
您必须初始化您的数组。不为局部变量执行默认初始化。这就是它打印垃圾值的原因。
相关文章:
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 回溯C++不打印函数,因此文件
- 在一定长度后从数组中打印时缺少整数
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 在gem5中打印文件中的所有cache_blocks
- 打印数字图案
- Log4cpp:以UTC/GMT时区打印日期
- 如何使用gdb制作一个可以漂亮地打印每个对象的C++函数