Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 添加字符串变量后的两个不同的双精度值_C++ - Fatal编程技术网

C++ 添加字符串变量后的两个不同的双精度值

C++ 添加字符串变量后的两个不同的双精度值,c++,C++,我使用g编译了以下代码++ #include <iostream> int main() { double res; std::cout << res << std::endl; return 0; } 但是在一个小小的改变之后 #include <iostream> int main() { std::string input; double res; std::cout <<

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

#include <iostream>

int main()
{
    double res;
    std::cout << res << std::endl; 
    return 0;
}
但是在一个小小的改变之后

#include <iostream>

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

为什么结果不同,为什么数字是2.0734e-317?

它是任意的。

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

因此,读取其“值”具有未定义的行为。任何事情都有可能发生


您不仅可以获得任何值(由于内部假设,您无法从编译器实现的黑盒外部对其进行合理化),而且还可以/相反地打开黑洞或杀死我的猫,我不会对这两种结果感到非常高兴。

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

您的代码调用未定义的行为。由于内置类型的自动变量未经deafult初始化(除非特别指定),因此代码中未定义变量res的值。它可以是任何东西

为什么根据不同的代码结构有不同的值是可以理解的——因为没有人为变量设置值,所以在以前的调用之后,堆栈内存中剩下的东西都留给您了。纯粹随机的


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

使用未初始化的变量是未定义的行为。这个有很多重复的,,但它们相对来说很难找到。我发现很难相信你的书没有教你初始化变量,并向你解释为什么这很重要。我投票结束这个问题,因为解释未定义行为的结果实际上是无用的,一个无法回答的问题。哦,这是一个很好的格式具有优秀MCVE的问题,这可能是一个相当好的规范重复…@πάνταῥεῖ, 编译器是确定性状态机,它们在相同的输入下生成相同的代码。进程的内存布局也是确定的。在这种情况下,很容易解释OP看到的结果。你真的有一只猫吗?@LightnessRacesinOrbit我建议你给自己买一只薛定谔猫。@πάνταῥεῖ 想说同样的话,但决定的话太明显了:顺便说一句,我最近养了一只小雄猫。虽然那个家伙每天都让我紧张,做各种愚蠢的行为,但我甚至不会浪费一点心思让他陷入薛定谔的处境@SergeyA@πάνταῥεῖ: 也许我会的。也许我不会。:)
#include <iostream>

int main()
{
    std::string input;
    double res;
    std::cout << res << std::endl; 
    return 0;
}
g++ foo.c
./a.out
2.0734e-317