当我打印未初始化的变量时,为什么会看到奇怪的值?

cmu*_*use 13 c++ variables initialization c++-faq

在以下代码中,变量没有初始值并打印此变量.

int var;
cout << var << endl;
Run Code Online (Sandbox Code Playgroud)

输出:2514932

double var;
cout << var << endl;
Run Code Online (Sandbox Code Playgroud)

输出:1.23769e-307

我不明白这些输出数字.任何人都可以向我解释一下吗?

GMa*_*ckG 35

简而言之,var未初始化并且读取未初始化的变量会导致未定义的行为.

所以不要这样做.你做的那一刻,你的程序不再保证做你说的任何事情.


正式地,"读取"值意味着对其执行左值到右值的转换.并且§4.1声明"......如果对象未初始化,则需要进行此转换的程序具有未定义的行为."

实际上,这只意味着值是垃圾(毕竟,很容易看到读取int,例如,只是获取随机位),但我们不能得出结论,或者你将定义未定义的行为.

举一个真实的例子,考虑:

#include <iostream>

const char* test()
{
    bool b; // uninitialized

    switch (b) // undefined behavior!
    {
    case false:
        return "false";      // garbage was zero (zero is false)
    case true: 
        return "true";       // garbage was non-zero (non-zero is true)
    default:
        return "impossible"; // options are exhausted, this must be impossible...
    }
}

int main()
{
    std::cout << test() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

天真地,人们会得出结论(通过评论中的推理),这应该永远不会打印出来"impossible"; 但由于行为不明确,一切皆有可能.用它编译g++ -02.

  • 到目前为止唯一技术上正确的答案+1 (3认同)

wkl*_*wkl 4

当你这样做时:

int var;

您仅声明一个名为 的整数var。您没有使用值对其进行初始化,因此无论在什么位置var,都将是垃圾数据。

int var = 5;

将声明 var 并将其初始化为 5。

查看更多: http: //en.wikipedia.org/wiki/Uninitialized_variable