C ++中的变量初始化

时间:2010-02-07 20:42:48

标签: c++ variables initialization

我的理解是int变量会自动初始化为0;但事实并非如此。下面的代码打印一个随机值。

int main () 
{   
    int a[10];
    int i;
    cout << i << endl;
    for(int i = 0; i < 10; i++)
        cout << a[i] << " ";
    return 0;
}
  • 什么规则(如果有的话)适用于初始化?
  • 具体而言,在什么条件下自动初始化变量?

11 个答案:

答案 0 :(得分:65)

如果

,它将自动初始化
  • 它是一个类/结构实例,其中默认构造函数初始化所有基本类型;像MyClass instance;
  • 您使用数组初始化程序语法,例如int a[10] = {}(全部归零)或int a[10] = {1,2};(除前两项外全部归零:a[0] == 1a[1] == 2
  • 同样适用于非聚合类/结构,例如MyClass instance = {}; (有关此内容的更多信息,请参见here
  • 这是一个全局/外部变量
  • 变量定义为static(无论是在函数内还是在全局/命名空间范围内) - 感谢Jerry

永远不要相信普通类型的变量(int,long,...)被自动初始化!它可能发生在像C#这样的语言中,但不会发生在C&amp; C ++。

答案 1 :(得分:11)

int未初始化为零。当你说int i;时,你所做的就是为整数保留空间。该位置的值未初始化。只有在你说int i = 0;(或int i = 5;时才会这样做,在这种情况下,值被初始化为5)。无论如何,将变量初始化为某个已知值是一种很好的做法。否则,i保留为该内存空间保留的任何随机值。这就是cout打印出随机值的原因。

默认值取决于语言的实现。有些语言会将其初始化为某种“理智”值(或许可能为0)。根据经验,我总是将变量初始化为一些合理的值(除非我知道在使用它之前我会将其初始化为其他以确保)。正如我之前提到的,假设这个值是理智的是不明智的。它可能是也可能不是(取决于语言,或该语言的解释器/编译器的实现)。

答案 2 :(得分:5)

请参见4.9.5 C ++编程语言的初始化。

取决于您的变量是否为本地,静态,用户定义或const默认初始化可能发生。

因为您正在使用POD(普通旧数据类型),所以自动变量不会初始化为任何默认值。

答案 3 :(得分:4)

这篇文章最好说:http://www.velocityreviews.com/forums/showpost.php?p=1528247&postcount=10

  

没有“默认”构造函数   非类型,但有默认值   (零)初始化。不幸,   对于脑死亡与C的兼容性,   默认初始化没有完成   适用于以下POD类型   情况:

     

裸体(即声明没有   初始化者)a的本地变量   阶级或功能。

     

动态分配的实例。

     

然而,在其他地方(特别是   静态变量)和在的情况下   给出空初始化器的任何东西   参数(当它有效时),得到   默认(零)初始化。

答案 4 :(得分:4)

要强制初始化POD(int是),您可以使用复制初始值设定语法:

#include <iostream>

int main() {
  int i = int();
  int j;

  std::cout << "i: " << i << std::endl;
  // warning: undefined behavior
  std::cout << "j: " << j << std::endl;
}

这属于“只支付您使用的费用”。如果您要随后为变量赋值,或者根本不使用它,则没有理由进行初始化。要做到这一点,你必须明确要求完成这项工作。

答案 5 :(得分:3)

在C ++中,自动变量是未定义的,直到它们被显式赋值。也许您正在考虑使用C#或其他.Net语言,或Java。

答案 6 :(得分:3)

不同的操作系统(即OS X与Ubuntu Linux)对C ++中的未初始化变量与初始化变量的反应不同。根据我的经验,OS X版本的gcc将为下面两个版本的代码编译和打印2。如果我正在使用Ubuntu Linux机器,第一个代码块将打印出变量引用的内存位置(循环后+2)。

    int c;

    for( int i = 0; i < 3; i++ )
    {
        c++;
    }

    cout << c << endl; 

在哪里,他们都会给你相同的结果:

    int c = 0;

    for( int i = 0; i < 3; i++ )
    {
        c++;
    }

    cout << c << endl; 

答案 7 :(得分:2)

除非您自己执行,否则不会初始化局部变量。您所看到的是在调用方法之前堆栈中的垃圾。

答案 8 :(得分:2)

  

如果没有为对象指定初始化程序,则默认初始化该对象;如果没有执行初始化,则   具有自动或动态存储持续时间的对象具有不确定的值。

帕。 8.5,最近的C ++ 0x草案N3092.pdf的第11节,

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/

答案 9 :(得分:0)

虽然你最近的发现可能不受欢迎(因为你可能需要初始化其他语言会考虑的一些变量),但它可能意味着更少的cpu周期,从而更快的代码。

答案 10 :(得分:-1)

此处int i;是一个自动变量,必须手动初始化。 auto变量不会在c和c ++中自动初始化。

如果您希望编译器初始化它,那么您需要使用以下内容,

i声明为静态变量。

static int i; //由编译器分配给i。

i声明为[在main()]之外的全局变量。