我几乎没有开始我的c ++学习。我遇到了一个我无法理解的奇怪案例。
这是关于声明和打印double
变量。
我的第一段代码如下所示:
#include <iostream>
int main ()
{
double wage;
std::cout << wage << std::endl;
return 0;
}
用g++
编译此文件后运行它,我的终端上打印了0
,没问题。然后我不断添加代码行,现在它看起来像这样:
#include <iostream>
int main ()
{
double wage;
std::cout << wage << std::endl;
double salary = wage = 9999.99;
std::cout << wage << std::endl;
std::cout << salary << std::endl;
std::cout << wage
<< salary << std::endl;
return 0;
}
但是,当我尝试再次编译并运行此程序时,会出现一个非常奇怪的小数。
$ cpp-directory ./a.out
2.122e-314
9999.99
9999.99
9999.999999.99
从结果中可以看出,有一个2.122e-314
。从我的角度来看,它应该在第一行打印0而不是这个数字......我不熟悉c ++的东西,但它是否像内存泄漏那样......
有人可以给我一个提示或解释吗? 感谢。
注意:
$ ~ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
答案 0 :(得分:4)
int main () { double wage; std::cout << wage << std::endl;//Undefined Behavior! return 0; }
您尚未使用值初始化wage
,这意味着它的值将是在您的程序进入此堆栈帧之前占用这些字节的任何事件。如果您尝试使用该值(除了写入之外的任何方式),程序将读取该垃圾值并将其解释为double
。在某些情况下,该内存将初始化为0.在其他情况下,它可以初始化为字面上的任何内容。如果您想保证获得0
的值,则需要明确地设置它:
int main ()
{
double wage = 0;
std::cout << wage << std::endl;//Perfectly Defined Behavior!
return 0;
}
答案 1 :(得分:1)
输出(即读取)未初始化的double类型变量的值的行为是未定义的。尝试考虑输出是毫无意义的 - 您可以随时检查生成的程序集,这可能会产生一些关于编译器已完成的线索。
第二个片段中的复合赋值有效,并且两个数字在最终输出中连接。
有些语言(例如BASIC的各种版本)没有初始化变量,但C ++不是其中之一。