添加字符串变量后的两个不同的double值

时间:2015-11-18 17:05:29

标签: c++

我使用g ++编译了以下代码

#include <iostream>

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

得出以下结果

g++ foo.c
./a.out
0

但经过一些小改变后

#include <iostream>

int main()
{
    std::string input;
    double res;
    std::cout << res << std::endl; 
    return 0;
}

成了

g++ foo.c
./a.out
2.0734e-317

为什么结果不同以及为什么数字为2.0734e-317

3 个答案:

答案 0 :(得分:2)

这是任意的。

您没有初始化您的变量。它有一个未指定的值

因此,阅读其价值&#34;有未定义的行为。任何事情都可能发生。

你不仅可以得到任何价值(由于内部假设,你无法从编译器实现的黑匣子外部合理化),但你也可以/而是打开一个黑洞或杀死我的猫,我会对这两种结果都不是非常高兴。

答案 1 :(得分:2)

您的代码调用未定义的行为。由于内置类型的自动变量除非特别指定,否则不会进行deafult-initialized,因此在代码中未定义变量res的值。它可以是任何东西。

为什么你有不同的值,他们根据不同的代码结构是可以理解的 - 因为没有人设置变量的值,你留下了在之前的调用之后留在堆栈内存中的任何东西。纯随机。

特别是,在前一个示例中,在声明res变量之前,根本不使用堆栈内存。因此,您使用未触及的堆栈内存,即0初始化。在后一种情况下,您已经定义了字符串变量,并将其称为构造函数。构造函数为了它自己的目的使用堆栈内存,并将那些值保留在那里。现在res变量是在使用过的堆栈内存中构建的,你可以在那里看到一些随机值。

答案 2 :(得分:0)

您正在输出未初始化的变量。所以它的价值可以是任何东西。