这种方式初始化数组为全0的形式:
char myarray[ARRAY_SIZE] = {0}
所有编译器都支持吗?
如果是,是否有类似其他类型的语法?例如:
bool myBoolArray[ARRAY_SIZE] = {false}
是的,所有C++编译器都支持这种初始化方式。这是C++语言的一部分。实际上,这是从C语言中引入到C++中的惯用法。在C语言中,= { 0 }
是一种惯用的通用零初始化器。在C++中也几乎如此。
由于这个初始化器是通用的,对于布尔数组,您实际上不需要不同的“语法”。0
也可以作为bool
类型的初始化器。
bool myBoolArray[ARRAY_SIZE] = { 0 };
这个方法保证用false
来初始化整个数组。此外,
char* myPtrArray[ARRAY_SIZE] = { 0 };
使用char *
类型的null指针保证了整个数组被初始化为null。
如果您认为这样可以提高可读性,当然可以使用。
bool myBoolArray[ARRAY_SIZE] = { false };
char* myPtrArray[ARRAY_SIZE] = { nullptr };
但关键是= { 0 }
变量会给您完全相同的结果。
然而,在C++中,= { 0 }
可能对于所有类型都不起作用,例如枚举类型,它们不能用整数0
进行初始化。但是C++支持更短的形式。
T myArray[ARRAY_SIZE] = {};
即只有一对空的 {}
。这将默认初始化任何类型的数组(假设元素允许默认初始化),这意味着对于基本(标量)类型,整个数组将被正确的零初始化。
bool myBoolArray[ARRAY_SIZE] = { false };
,数组中的所有元素都会初始化为 false。但如果我写 bool myBoolArray[ARRAY_SIZE] = { true };
,只有第一个元素会被设置为 true,其他一切都是 false。有什么解释吗? - rookie coderbool
数组,剩下的将自动进行零初始化。这就是现实。 - AnT stands with Russiabool myBoolArray[ARRAY_SIZE];
,那么数组中就会包含随机值,因此我不会期望初始化会返回一个带有不同值的数组。就这样。 - rookie coder请注意,在C++11通用初始化语法中,'='是可选的,通常更好的做法是写成:
char myarray[ARRAY_SIZE] {0}
char myarray[ARRAY_SIZE] {0}
?将 myarray
的每个元素初始化 ARRAY_SIZE
次? - John0
,其他元素默认初始化为零。 - undefinedarray
和vector
。int main()
{
bool arr1[3]; // true true true [here true is SOME garbage value]
std::vector<bool> vec1(3); // false false false
bool arr2[3] = { true }; // true false false [here true/false are REAL true/false values]
vector<bool> vec2(3, true); // true true true
bool arr3[3] = { false }; // false false false
std::vector<bool> vec3(3, false); // false false false
int arr4[3]; // GV GV GV - garbage value
std::vector<int> vec4(3); // 0 0 0
int arr5[3] = { 1 }; // 1 0 0
std::vector<int> vec5(3, 1); // 1 1 1
int arr6[3] = { 0 }; // 0 0 0
std::vector<int> vec6(3, 0); // 0 0 0
}
是的,我相信它应该可以工作,并且也可以应用于其他数据类型。
对于类数组而言,如果初始化列表中的项比数组中的元素少,则默认构造函数将用于剩余的元素。如果未为类定义默认构造函数,则初始化列表必须完整 - 也就是说,数组中的每个元素都必须有一个初始化器。
int myArray[array_size];
双精度浮点数: double myArray[array_size];
字符和字符串: char myStringArray[array_size];
字符和字符串之间的区别如下所示。char myCharArray[6]={'a','b','c','d','e','f'};
char myStringArray[6]="abcdef";
如果你不知道数组的大小,则应该像以下一样留空数组。
整数: int myArray[array_size];
双精度浮点数: double myArray[array_size];
false
和0
是一样的(否则if(false)
就不会被评估为 false),所以你所拥有的可能在 99% 的编译器上都能工作。在引用标准之前,无法确定另外的 1%。 - Chris Lutzint a[10] = { 1, 2, 3 };
会将a[3]..a[9]
设置为0
,(“隐式初始化与具有静态存储期的对象相同”)。这对于C++也适用吗? - Alok Singhalfalse
不等于0
,但在{0}
中,0会被转换为false
,而在(对于C++来说){}
中,你甚至不需要关心转换:它被初始化为false
或0
或空指针或任何其他与类型有关的默认值。 - Johannes Schaub - litb