我使用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
?
答案 0 :(得分:2)
这是任意的。
您没有初始化您的变量。它有一个未指定的值。
因此,阅读其价值&#34;有未定义的行为。任何事情都可能发生。
你不仅可以得到任何价值(由于内部假设,你无法从编译器实现的黑匣子外部合理化),但你也可以/而是打开一个黑洞或杀死我的猫,我会对这两种结果都不是非常高兴。
答案 1 :(得分:2)
您的代码调用未定义的行为。由于内置类型的自动变量除非特别指定,否则不会进行deafult-initialized,因此在代码中未定义变量res的值。它可以是任何东西。
为什么你有不同的值,他们根据不同的代码结构是可以理解的 - 因为没有人设置变量的值,你留下了在之前的调用之后留在堆栈内存中的任何东西。纯随机。
特别是,在前一个示例中,在声明res变量之前,根本不使用堆栈内存。因此,您使用未触及的堆栈内存,即0初始化。在后一种情况下,您已经定义了字符串变量,并将其称为构造函数。构造函数为了它自己的目的使用堆栈内存,并将那些值保留在那里。现在res变量是在使用过的堆栈内存中构建的,你可以在那里看到一些随机值。
答案 2 :(得分:0)
您正在输出未初始化的变量。所以它的价值可以是任何东西。