1

所以我在 C++ 中创建了一个未初始化的数组,并尝试打印最后一个元素以查看输出是什么。未初始化数组中的每个元素的值都应该是 0(对吗?),但我得到的输出是别的东西。这是主要功能的样子:

int main() {
    int i[5];
    cout << i[4] << '\n';
}

1606416656使用换行符运行此输出(每次相同的数字)。但是,更改'\n'endl将输出更改为0换行符。

这是为什么?

此外,即使i[3]使用. 为什么?i[4]0'\n'

我做了一些研究并阅读了一些'\n'不会“刷新缓冲区”的地方endl。这个“刷新流”实际上是什么意思,这是影响输出的原因吗?

4

3 回答 3

2

未初始化数组中的每个元素的值都应为 0(对吗?)

不,它们具有不确定的价值。使用这些值会产生未定义的行为,这就是为什么您会得到不可预测的输出。

这个“刷新流”实际上是什么意思,这是影响输出的原因吗?

当您写入流时,输出存储在内存缓冲区中,不一定会立即发送到最终目的地(控制台、文件或其他任何东西);这可以带来很大的性能优势,但也可能意味着您在需要时看不到最终输出。刷新流会将您写入的数据推送到最终目的地。

于 2014-04-04T11:03:06.983 回答
1

您的数组仍未初始化。你得到的任何价值都是巧合。std::endl 放入换行符并刷新输出流缓冲区。这就是 std::endl 操纵器和只打印换行符的区别。

于 2014-04-04T11:02:51.623 回答
1

您认为堆栈上新创建的数组初始化为零的假设不成立。因此,您的输出是随机的。更改程序会重新排序内存布局,因此您会看到不同的结果。

int main() {
    int i[5];
    for (int k = 0; k < 5; ++k)
        i[k] = 0;
    cout << i[4] << '\n';
}

无论使用 '\n' 还是 endl 都应该给你预期的结果

于 2014-04-04T11:12:57.890 回答