使用' \ n'而不是endl影响输出,为什么?

时间:2014-04-04 10:59:29

标签: c++ newline line-breaks flush endl

所以我在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;实际上是指,这是影响产出的因素吗?

3 个答案:

答案 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

都应始终为您提供预期的结果