是将数组初始化为全0的一种形式char myarray[ARRAY_SIZE] = {0}是否受所有编译器支持?如果有,是否有与其他类型类似语法?例如
char myarray[ARRAY_SIZE] = {0}
bool myBoolArray[ARRAY_SIZE] = {false}
zf9nrax11#
是的,所有的C编译器都支持这种形式的初始化。它是 C 的一部分。事实上,它是从C语言到C的一个习惯用法。在C语言中,= { 0 }是一个习惯用法的“通用零初始化器”。在C中,“几乎”也是如此。因为这个初始化器是通用的,所以对于bool数组,您实际上不需要不同的“语法”。0也可以作为bool类型的初始化器,所以
= { 0 }
bool
0
bool myBoolArray[ARRAY_SIZE] = { 0 };
保证使用false初始化整个数组。
false
char* myPtrArray[ARRAY_SIZE] = { 0 };
in保证使用char *类型的空指针初始化整个数组。如果您认为它可以提高可读性,当然可以使用
char *
bool myBoolArray[ARRAY_SIZE] = { false }; char* myPtrArray[ARRAY_SIZE] = { nullptr };
但关键是= { 0 }变体给你 * 完全 * 相同的结果。然而,在C++中,= { 0 }可能并不适用于所有类型,例如枚举类型,它不能用整数0初始化。
T myArray[ARRAY_SIZE] = {};
这将默认初始化任何类型的数组(假设元素允许默认初始化),这意味着对于基本(标量)类型,整个数组将被正确地零初始化。
flvtvl502#
请注意,在C++11通用初始化语法中,“=”是可选的,并且通常被认为是更好的编写风格:
char myarray[ARRAY_SIZE] {0}
zhte4eai3#
是的,我相信它应该工作,它也可以应用于其他数据类型。对于类数组,如果初始化器列表中的项比数组中的元素少,则默认构造函数用于剩余的元素。如果没有为类定义默认构造函数,则初始化器列表必须是完整的-也就是说,数组中的每个元素都必须有一个初始化器。
d8tt03nd4#
在C++中可以用以下几种方法声明数组。如果你知道数组的大小,那么你应该声明数组:整数:int myArray[array_size];双精度:double myArray[array_size];字符和字符串:char myStringArray[array_size];字符和字符串之间的区别如下
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];
ego6inou5#
此外,如果不显式初始化array和vector,请注意它们是如何默认初始化的。
array
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 }
5条答案
按热度按时间zf9nrax11#
是的,所有的C编译器都支持这种形式的初始化。它是 C 的一部分。事实上,它是从C语言到C的一个习惯用法。在C语言中,
= { 0 }
是一个习惯用法的“通用零初始化器”。在C中,“几乎”也是如此。因为这个初始化器是通用的,所以对于
bool
数组,您实际上不需要不同的“语法”。0
也可以作为bool
类型的初始化器,所以保证使用
false
初始化整个数组。in保证使用
char *
类型的空指针初始化整个数组。如果您认为它可以提高可读性,当然可以使用
但关键是
= { 0 }
变体给你 * 完全 * 相同的结果。然而,在C++中,
= { 0 }
可能并不适用于所有类型,例如枚举类型,它不能用整数0
初始化。这将默认初始化任何类型的数组(假设元素允许默认初始化),这意味着对于基本(标量)类型,整个数组将被正确地零初始化。
flvtvl502#
请注意,在C++11通用初始化语法中,“=”是可选的,并且通常被认为是更好的编写风格:
zhte4eai3#
是的,我相信它应该工作,它也可以应用于其他数据类型。
对于类数组,如果初始化器列表中的项比数组中的元素少,则默认构造函数用于剩余的元素。如果没有为类定义默认构造函数,则初始化器列表必须是完整的-也就是说,数组中的每个元素都必须有一个初始化器。
d8tt03nd4#
在C++中可以用以下几种方法声明数组。如果你知道数组的大小,那么你应该声明数组:整数:
int myArray[array_size];
双精度:double myArray[array_size];
字符和字符串:char myStringArray[array_size];
字符和字符串之间的区别如下如果你不知道数组的大小,那么你应该像下面这样把数组留空。
整数:
int myArray[array_size];
双人间:
double myArray[array_size];
ego6inou5#
此外,如果不显式初始化
array
和vector
,请注意它们是如何默认初始化的。