所以我在C ++中创建了一个未初始化的数组,并尝试打印最后一个元素以查看输出结果。未初始化数组中的每个元素都应该具有值0(对吗?),但我得到的输出是其他的。这就是主要功能:
int main() {
int i[5];
cout << i[4] << '\n';
}
使用换行符运行此输出1606416656
(每次都是相同的数字)。但是,将'\n'
更改为endl
会使用换行符将输出更改为0
。
为什么?
此外,即使使用i[3]
,尝试打印i[4]
代替0
也能正确输出'\n'
。为什么呢?
我做了一些研究并阅读了'\n'
没有&#34;刷新缓冲区&#34;而endl
确实如此。这是什么&#34;冲洗流&#34;实际上是指,这是影响产出的因素吗?
答案 0 :(得分:2)
未初始化数组中的每个元素的值都应为0(对吗?)
不,他们有不确定的价值。使用这些值会产生未定义的行为,这就是您获得不可预测的输出的原因。
这是什么&#34;冲洗流&#34;实际上是指,这是影响产出的因素吗?
当您写入流时,输出存储在内存缓冲区中,而不必立即发送到最终目标(控制台,文件或其他);这可以带来很大的性能优势,但也可能意味着您不希望看到最终输出。刷新流将您已写入的数据推送到最终目的地。
答案 1 :(得分:1)
您的阵列仍然没有投入资格。无论你得到什么价值都是巧合。 std :: endl放置换行符并刷新输出流缓冲区。这就是std :: endl操纵器的区别,只打印换行符。
答案 2 :(得分:1)
您假设堆栈上新创建的数组初始化为零并不成立。因此您的输出是随机的。更改程序会重新排序内存布局,因此您会看到不同的结果。
int main() {
int i[5];
for (int k = 0; k < 5; ++k)
i[k] = 0;
cout << i[4] << '\n';
}
无论使用'\ n'还是endl ,都应始终为您提供预期的结果