C ++数组初始化


80

是将数组初始化为全0的形式吗

char myarray[ARRAY_SIZE] = {0} 所有编译器都支持吗?,

如果是这样,是否有与其他类型相似的语法?例如

bool myBoolArray[ARRAY_SIZE] = {false} 

我敢打赌,好钱false0(否则if(false)不会计算为假)相同,因此您所拥有的将可能对99%的编译器起作用。除非我们引用标准,否则无法确定其他1%。
克里斯·卢茨

我知道在C中,int a[10] = { 1, 2, 3 };将设置a[3]..a[9]0,(“与具有静态存储持续时间的对象隐式初始化相同”)。这对于C ++是否成立?
Alok Singhal

5
是的,它确实。如果它没有对C保持为真++那么C ++不会甚至远程与向后兼容C.
克里斯·鲁茨

2
false与并不相同0,但是在{0}0中转换为false,在(对于C ++)中,{}您甚至不必关心转换:它被初始化为falseor0或null指针或任何其他类型敏感的默认值。
Johannes Schaub-litb

Answers:


139

是的,所有C ++编译器都支持这种形式的初始化。它是C ++语言的一部分。实际上,这是来自C语言的C ++语言。用C语言= { 0 }编写的是惯用的通用零初始化程序。这也是几乎在C ++中的情况。

由于此初始化器是通用的,因此对于bool数组,您实际上不需要其他的“语法”。0也可用作bool类型的初始化程序,因此

bool myBoolArray[ARRAY_SIZE] = { 0 };

确保使用初始化整个数组false。以及

char* myPtrArray[ARRAY_SIZE] = { 0 };

in保证使用类型为null的空指针初始化整个数组char *

如果您认为它可以提高可读性,则可以使用

bool myBoolArray[ARRAY_SIZE] = { false };
char* myPtrArray[ARRAY_SIZE] = { nullptr };

但关键是= { 0 }变体为您提供了完全相同的结果。

但是,在C ++中= { 0 }可能无法对所有类型都起作用,例如枚举类型,例如,不能使用integer初始化的类型0。但是C ++支持较短的形式

T myArray[ARRAY_SIZE] = {};

即只是一对空的{}。这将默认初始化任何类型的数组(假设元素允许默认初始化),这意味着对于基本(标量)类型,整个数组将被正确地初始化为零。


8
和C ++ 0x中,你将能够初始化这样的事
JK。

4
在我的编译器(qt创建者2.4.1-qt版本4.8.0)上,如果我写bool myBoolArray[ARRAY_SIZE] = { false };的数组都初始化为false,但是如果我bool myBoolArray[ARRAY_SIZE] = { true };只写第一个元素则设置为true,而其他所有元素均为false。有什么解释吗?
新秀编码器

@rookie编码器:究竟是什么解释?您期望会发生什么?在C ++中,如果您部分初始化了一个bool数组,那么其余的将为您零初始化。就是那样子。
AnT

1
@AndreyT很好,但是我发现这种行为至少违反直觉。如果我不进行初始化(如)bool myBoolArray[ARRAY_SIZE];,则该数组正确地包含随机值,因此,我不会期望初始化会返回其中包含不同值的数组。就这样。
菜鸟编码者

1
@AndreyT:可以,但是我从来没有想过雪崩会和第一个元素不同;-)无论如何,谢谢你提供的信息!
菜鸟编码者

18

请注意,'='在C ++ 11通用初始化语法中是可选的,通常被认为是更好的编写方式:

char myarray[ARRAY_SIZE] {0}

0

是的,我相信它应该可以工作,并且也可以应用于其他数据类型。

但是,对于类数组,如果初始化列表中的项少于数组中的元素,则默认构造函数用于其余元素。如果没有为该类定义默认的构造函数,则初始化程序列表必须完整—也就是说,数组中的每个元素都必须有一个初始化程序。


0

您可以通过这些方式在C ++中声明数组。如果知道数组大小,则应声明以下数组:整数:int myArray[array_size];double myArray[array_size]; 精度:Char和string:char myStringArray[array_size]; char和string之间的区别如下

char myCharArray[6]={'a','b','c','d','e','f'};
char myStringArray[6]="abcdef";

如果您不知道数组的大小,则应将数组留空,如下所示。

整数: int myArray[array_size];

双: double myArray[array_size];

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.