C ++中的变量初始化

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

int main () 
{   
    int a[10];
    int i;
    cout << i << endl;
    for(int i = 0; i < 10; i++)
        cout << a[i] << " ";
    return 0;
}
  • 什么规则适用于初始化?
  • 具体来说,在什么条件下变量会自动初始化?
skydoor asked 2020-08-05T02:35:26Z
11个解决方案
67 votes

如果出现以下情况,它将自动初始化

  • 这是一个类/结构实例,默认构造函数在其中初始化所有原始类型; 像static
  • 您使用数组初始化器语法,例如 static(全部置零)或int a[10] = {1,2};(除了前两项外全部置零:2999732953790252034和a[1] == 2
  • 同样适用于非集合类/结构,例如 MyClass实例= {}; (有关更多信息,请参见此处)
  • 这是一个全局/外部变量
  • 该变量定义为static(无论是在函数内部还是在全局/命名空间范围内)-感谢Jerry

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

AndiDog answered 2020-08-05T02:38:01Z
11 votes

int不会初始化为零。 当您说int i;时,您要做的就是为整数保留空间。 该位置的值未初始化。 您只需要说int i = 0;(或int i = 5;,在这种情况下将值初始化为5)即可。 无论哪种方式,将变量初始化为某个已知值都是一个好习惯。 否则,当为它保留空间时,i将保留该内存位置处的任何随机值。 这就是cout打印出随机值的原因。

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

Vivin Paliath answered 2020-08-05T02:38:27Z
5 votes

请参阅第4.9.5节“ C ++编程语言的初始化”。

根据变量是本地变量,静态变量,用户定义变量或const缺省初始化,可能会发生。

由于您使用的是POD(普通旧数据类型),因此auto变量不会初始化为任何默认值。

Nick Presta answered 2020-08-05T02:38:56Z
4 votes

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

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

裸露(即声明为无 初始值设定项)局部变量 类或函数。

动态分配的实例。

但是,在其他地方(尤其是 静态变量),并且在 给出空初始化器的任何东西 参数(有效时),获取 默认(零)初始化。

Will answered 2020-08-05T02:39:34Z
4 votes

要强制初始化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;
}

这属于“仅按使用量付费”。 如果随后要为该变量分配一个值,或者可能根本不使用它,则没有理由进行初始化它的工作。 为此,您必须明确要求完成该工作。

Logan Capaldo answered 2020-08-05T02:39:59Z
3 votes

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

Jakob Borg answered 2020-08-05T02:40:19Z
3 votes

不同的操作系统(即OS X与Ubuntu Linux)对C ++中的未初始化变量和已初始化变量的反应不同。 以我的经验,gcc的OS X版本将针对以下两个版本的代码进行编译和打印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; 
t. fochtman answered 2020-08-05T02:40:44Z
2 votes

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

Anon. answered 2020-08-05T02:41:04Z
2 votes

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

标准杆 8.5,最新的C ++ 0x草案N3092.pdf,第11节,

[HTTP://呜呜呜.open-实体店.org/脚踏车1/生成22/我国21/docs/papers/2010/]

eel ghEEz answered 2020-08-05T02:41:33Z
0 votes

尽管您最近的发现可能不受欢迎(因为您可能需要初始化一些其他语言会处理的变量),但这可能意味着更少的cpu周期,从而加快了代码速度。

phlip answered 2020-08-05T02:41:53Z
-1 votes

在这里i是一个自动变量,必须手动对其进行初始化。auto变量不会在c和c ++中自动初始化。

如果您想让编译器对其进行初始化,则需要使用以下内容,

声明i为静态变量。

i //编译器将零分配给i。

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

Nitesh answered 2020-08-05T02:42:31Z
translate from https://stackoverflow.com:/questions/2218254/variable-initialization-in-c