默认variables值

如果我在声明它的时候没有给一个variables赋值,它是否默认为零或者只是以前在内存中的内容?

例如

float x; 

声明的variables可以是零初始化初始化值默认初始化

C ++ 03 Standard 8.5 / 5恰当地定义了每一个:

初始化 Ttypes的对象意味着:

– 如果T是标量types(3.9),则将该对象设置为转换为T的0(零)值;
– 如果T是非联合类types,则每个非静态数据成员和每个基类子对象
是零初始化的;
– 如果T是一个联合types,则该对象的第一个命名数据成员是零初始化的;
– 如果T是一个数组types,每个元素都是零初始化的;
– 如果T是引用types,则不执行初始化。

默认初始化 Ttypes的对象意味着:
– 如果T是非POD类types(第9章),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不合格)。
– 如果T是数组types,则每个元素都默认初始化;
否则,该对象是零初始化的。

为了初始化 Ttypes的对象,意味着:
– 如果T是一个具有用户声明的构造函数(12.1)的类types(第9章),那么将调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是格式错误的)。
– 如果T是没有用户声明的构造函数的非联合类types,则T的每个非静态数据成员和基类组件都被初始化;
– 如果T是一个数组types,则每个元素都进行了值初始化;
否则,该对象是零初始化的

例如:

 #include<iostream> using namespace std; static int a; //Zero Initialized int b; //Zero Initialized int main() { int i; //Undefined Behavior, Might be Initialized to anything static int j; //Zero Initialized cout<<"\nLocal Uninitialized int variable [i]"<<i<<"\n"; cout<<"\nLocal Uninitialized Static int variable [j]"<<j<<"\n"; cout<<"\nGlobal Uninitialized Static int variable [a]"<<a<<"\n"; cout<<"\nGlobal Uninitialized int variable [b]"<<b<<"\n"; return 0; } 

你会注意到variablesi的结果在不同的编译器上会有所不同。 这种本地未初始化的variables不应该被使用。 实际上,如果你打开严格的编译器警告,编译器会报告一个错误。 以下是键盘如何报告错误。

 cc1plus: warnings being treated as errors In function 'int main()': Line 11: warning: 'i' is used uninitialized in this function 

编辑:正如@Kirill V. Lyadvinsky在评论中正确地指出的那样,不应该是一个相当强的词,而且在他的评论中指出一个例子时,可以使用完全有效的代码来使用未初始化的variables。 所以,我应该说:
你应该永远不要使用未初始化的variables,除非你确切地知道你在做什么。

这取决于。 如果这是一个局部variables(一个具有自动存储持续时间的对象),它将被初始化,如果它是一个全局variables(一个具有静态存储持续时间的对象),它将被初始化为零。 检查这个答案 。

这取决于variables的生命周期。 带有静态生命周期的variables在程序启动之前总是被初始化为0:对于基本types, enum和指针的初始化与将0分配给types相同。 在调用构造函数之前,即使variables具有构造函数,也会发生这种情况。

这取决于你声明的地方。 全局作用域中的variables用0初始化,堆栈variables未定义。

我认为这是不确定的。 我认为有些编译器在debugging模式下编译时,将其初始化为零。 但是,记忆中已经存在的东西也是可以的。 基本上 – 不要依赖任何行为。

更新:根据评论 – 全局variables将被初始化为零。 局部variables将是什么。

要回答你的第二个问题:

感谢 – 接下来是否有一个快捷方式将零分配给所有以下内容?:float x1,x2,x3,x4,x5,y1,y2,y3,y4,y5

你可以做

 float x[5] = {0,0,0,0,0}; float y[5] = {0,0,0,0,0}; 

并使用x[0]而不是x1

它可以是编译器特定的,但通常发布版本不会初始化variables到任何特定的值,所以你得到什么留在内存中。 但某些编译器在debugging版本中使用某些幻数来标记特定的内存区域。

在初始化之前使用任何variables的值(注意,静态存储持续时间对象总是被初始化,所以这只适用于自动存储持续时间)导致未定义的行为 。 这与将0包含为初始值或包含随机值非常不同。 UB意味着有可能发生任何事情。 在具有陷阱位的实现上,它可能会导致程序崩溃或产生信号。 多重读取也可能导致不同的不可预知的值,以及其他可想象的(或不可想象的)行为。 不要使用未初始化variables的值

注意:以下是根据评论编辑的:

请注意,这样的代码是无效的,除非您可以确保typesfoo_t没有填充位:

 foo_t x; int i; for (i=0; i<N; i++) x = (x<<1) | get_bit(); 

尽pipe目的是在循环结束之前最初放在x中的“随机值”被丢弃,但程序在访问x之后立即调用UB,以在第一次迭代中执行操作x<<1 ,从而整个程序输出无效。

C ++不会实例化variables。 x的值是当时在内存中发生的任何事情。 永远不要假设它的初始价值。