为什么在打印未初始化的变量时看到奇怪的值?

为什么在打印未初始化的变量时看到奇怪的值?

在以下代码中,该变量没有初始值,并打印了该变量。

int var;cout << var << endl;

输出:2514932

double var;cout << var << endl;

输出:1.23769e-307

我不明白这些输出数字。有人可以向我解释吗?


潇湘沐
浏览 562回答 3
3回答

翻过高山走不出你

简而言之,var未初始化,读取未初始化的变量会导致未定义的行为。所以不要这样做。当您这样做时,就不再保证您的程序可以执行您所说的任何事情。正式地,“读取”值表示对其执行从左到右的转换。§4.1指出“ ...如果对象未初始化,则需要进行此转换的程序将具有未定义的行为。”实用上,这只是意味着该值是垃圾(毕竟,很容易看到读取int,例如,获取随机位),但是我们无法得出结论,否则您将定义未定义的行为。举一个真实的例子,考虑:#include&nbsp;<iostream>const&nbsp;char*&nbsp;test(){ &nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;b;&nbsp;//&nbsp;uninitialized &nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(b)&nbsp;//&nbsp;undefined&nbsp;behavior! &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;false: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"false";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;garbage&nbsp;was&nbsp;zero&nbsp;(zero&nbsp;is&nbsp;false) &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;true:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"true";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;garbage&nbsp;was&nbsp;non-zero&nbsp;(non-zero&nbsp;is&nbsp;true) &nbsp;&nbsp;&nbsp;&nbsp;default: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"impossible";&nbsp;//&nbsp;options&nbsp;are&nbsp;exhausted,&nbsp;this&nbsp;must&nbsp;be&nbsp;impossible... &nbsp;&nbsp;&nbsp;&nbsp;}}int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;test()&nbsp;<<&nbsp;std::endl;}天真地,人们会得出结论(通过评论中的推理),这永远不应该印刷"impossible";但是如果行为不确定,一切皆有可能。用编译g++ -02。

慕田峪9158850

您得到的是编译器决定将变量解释为整数或双精度数的位置上堆栈中的任何数据。每次运行程序都可能是相同的,因为程序通常表现为确定性的。尽管在很多情况下,程序的最终运行结果都不相同。如果您稍稍更改了程序,或者在获得该代码之前根据用户的输入做出了决定,则可能会或可能不会获得不同的编号。基本上,您尚未初始化的变量的值是未指定的,并且绝对可以是任何值。没有韵律或原因。使用未初始化的变量(从形式上来说)是未定义的行为,并且可能导致各种奇怪的事情。这样做通常是不好的做法。您希望程序以可预测的方式运行,并且具有未初始化的变量是不可预测性的根源。请注意,最强调的不是随机性,而是不可预测性。如果您打开所有警告,大多数编译器都会抱怨类似的代码。
打开App,查看更多内容
随时随地看视频慕课网APP