c++ - 声明一个 double 给它一个值 0 但打印结果意外改变

标签 c++

<分区>

我才刚刚开始学习 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

最佳答案

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;
}

关于c++ - 声明一个 double 给它一个值 0 但打印结果意外改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294565/

相关文章:

python - 将构造函数添加到 Boost.Python 子类会导致参数不匹配错误

c++ - operator void* () 是什么意思?

c++ - 如何仅从字符串数组中复制确切的索引元素?

c++ - 未处理的异常,即使在添加 try-catch block 之后? C++

C++ 在该类的函数中使用该类的对象

c++ - 将字符串设置为 QDoubleSpinBox

c++ - 测试一个简单的链表,但它坚持向后迭代

c++ - C++ 中的可变仿函数可以支持命名字段吗?

c++ - YUV 帧层计算 - 需要概念理解

c++ - 在 C++ Armadillo 中使用虚数?