我的理解是int
变量会自动初始化为0
;但事实并非如此。下面的代码打印一个随机值。
int main ()
{
int a[10];
int i;
cout << i << endl;
for(int i = 0; i < 10; i++)
cout << a[i] << " ";
return 0;
}
答案 0 :(得分:65)
如果
,它将自动初始化MyClass instance;
int a[10] = {}
(全部归零)或int a[10] = {1,2};
(除前两项外全部归零:a[0] == 1
和a[1] == 2
)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节,
答案 9 :(得分:0)
虽然你最近的发现可能不受欢迎(因为你可能需要初始化其他语言会考虑的一些变量),但它可能意味着更少的cpu周期,从而更快的代码。
答案 10 :(得分:-1)
此处int i;
是一个自动变量,必须手动初始化。
auto变量不会在c和c ++中自动初始化。
如果您希望编译器初始化它,那么您需要使用以下内容,
将i
声明为静态变量。
static int i;
//由编译器分配给i。
将i
声明为[在main()]之外的全局变量。