繁体   English   中英

C++中的变量初始化

[英]Variable initialization in 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;
}
  • 哪些规则(如果有)适用于初始化?
  • 具体来说,在什么条件下变量会自动初始化?

它将自动初始化,如果

  • 它是一个类/结构实例,其中默认构造函数初始化所有原始类型; MyClass instance;
  • 您使用数组初始值设定项语法,例如int a[10] = {} (all zeroed) 或int a[10] = {1,2}; (除前两项外全部归零: a[0] == 1a[1] == 2
  • 同样适用于非聚合类/结构,例如 MyClass instance = {}; (更多信息可以在这里找到)
  • 这是一个全局/外部变量
  • 变量是static定义的(无论是在函数内还是在全局/命名空间范围内) -感谢 Jerry

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

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

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

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

根据您的变量是本地的、静态的、用户定义的还是 const 默认初始化,可能会发生。

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

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

非类类型没有“默认”构造函数,但有默认(零)初始化。 不幸的是,为了与 C 兼容,在以下情况下不会对 POD 类型进行默认初始化:

类或函数的局部变量(即,没有初始化器声明)局部变量。

动态分配的实例。

但是,在其他地方(特别是静态变量)和任何给定空的初始化参数的情况下(当它有效时),获得默认(零)初始化。

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

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

不同的操作系统(即 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; 

在 C++ 中,自动变量在被明确赋予一个值之前是未定义的。 也许您正在考虑 C# 或其他 .Net 语言,或者 Java。

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

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

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

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

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

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

如果你想让编译器初始化它,那么你需要使用以下东西,

i声明为静态变量。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM