首页 > 解决方案 > 为什么 std:endl 将零分配给未初始化的变量?

问题描述

请考虑以下 C++ 片段:

#include <iostream>

int main() {
    int x;
    std::cout << x << '\n';
    return 0;
}

正如预期的那样,由于变量x尚未初始化,因此打印的结果将是不可预测的。如果你运行它可能会得到 458785234 和 348934610 第二次。但是,如果您按以下方式更改代码:

#include <iostream>

int main() {
    int x;
    std::cout << x << std::endl;
    return 0;
}

现在,打印的 x 始终等于 0。这是为什么?请注意,引入的唯一更改是std::endl. 谁能解释为什么这将 0 分配给x变量?

标签: c++g++std

解决方案


正如预期的那样,打印的结果将是不可预测的......

现在,打印的 x 始终等于 0。这是为什么?

之所以如此,是因为行为未定义。

您预计该数字是“不可预测的”。看来您没有预测数字为零。这应该符合您的期望。

你没有做任何事情来使这个数字非零,那么你为什么期望这个数字非零呢?

另一方面,您可能一直期望行为不会改变,因为对程序的更改似乎无关紧要。这种期望是不明智的。如果您更改程序的任何部分,未定义的行为不能保证是相同的未定义行为。实际上,即使您不进行任何更改,也不能保证行为相同。另一方面,也不保证行为会有所不同。对程序的行为没有任何保证。这就是未定义行为的含义。


推荐阅读