c++ - 为什么 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
变量?
解决方案
正如预期的那样,打印的结果将是不可预测的......
现在,打印的 x 始终等于 0。这是为什么?
之所以如此,是因为行为未定义。
您预计该数字是“不可预测的”。看来您没有预测数字为零。这应该符合您的期望。
你没有做任何事情来使这个数字非零,那么你为什么期望这个数字非零呢?
另一方面,您可能一直期望行为不会改变,因为对程序的更改似乎无关紧要。这种期望是不明智的。如果您更改程序的任何部分,未定义的行为不能保证是相同的未定义行为。实际上,即使您不进行任何更改,也不能保证行为相同。另一方面,也不保证行为会有所不同。对程序的行为没有任何保证。这就是未定义行为的含义。
推荐阅读
- google-bigquery - BigQuery - REGEXP_REPLACE 的非法转义序列
- javascript - 数据未传递给 Vue 组件
- parsing - 简化 W3C 标准实施的资源
- php - PHP正则表达式查找并替换以某些字符开头和结尾的字符串的所有出现
- python - python codeforces psets 中的输入
- java-8 - 使用 Java 进行 Tally 集成
- kubernetes-operator - kubernetes 运算符,如何在描述中隐藏属性值
- android - 折叠时的Android多行通知
- c - 在链表中获取头值总是等于NULL?
- swift - 如何查看 URLSession.dataTaskPublisher 的当前进度?