奇怪的自动初始化行为

时间:2010-06-26 13:29:13

标签: c++

我了解到自动变量未初始化为零。因此,以下代码将正常运行并在屏幕上打印随机数字:

#include <iostream>
using std::cout;
using std::endl;

void doSomething()
{
  int i;
  cout << i << endl;
}

int main()
{
  doSomething();
}

但为什么这个剪辑不会以同样的方式表现呢?

#include <iostream>
using std::cout;
using std::endl;

void doSomething()
{
  int i;
  cout << i << endl;
}

int main()
{
  int j;
  cout << j << endl;
  doSomething();
}

此代码段显示:

0
0

有谁知道为什么“j”和“i”在这里突然被初始化为零?

2 个答案:

答案 0 :(得分:4)

使用未初始化的变量是未定义的行为。您可能不会在另一个编译器上获得相同的行为。唯一的“原因”是在您的特定C ++编译器的源代码中找到。

答案 1 :(得分:0)

如果为对象指定了初始化程序,则该初始值设定项确定对象的初始值。如果未指定初始化程序,则将全局(第4.9.4节),名称空间(第8.2节)或本地静态对象(第7.1.2节,第10.2.2节)(统称为静态对象)初始化为适当类型的0

例如:

// Global scope

int    a; // means ‘‘int    a = 0  ;’’
double d; // means ‘‘double d = 0.0;’’

默认情况下,不会初始化本地变量(有时称为自动对象)和在空闲存储上创建的对象(有时称为动态对象或堆对象)。

例如:

void f()
{
   int x; // x does not have a well defined value
   // ...
}

来自 Stroustrup,The C ++ Programming Language,3rd edition,p.83 - §4.9.5