[英]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] == 1
和a[1] == 2
)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 节,
尽管您最近的发现可能不受欢迎(因为您可能需要初始化其他语言会处理的一些变量),但它可能意味着更少的 cpu 周期,从而更快地编写代码。
这里int i;
是一个必须手动初始化的自动变量。 auto 变量不会在 c 和 c++ 中自动初始化。
如果你想让编译器初始化它,那么你需要使用以下东西,
将i
声明为静态变量。
static int i;
// 零分配给 i 由编译器。
将i
声明为全局变量[在 main() 之外]。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.