Correct and simplest syntactical way to initialise an array to 0
本问题已经有最佳答案,请猛点这里访问。
我正在尝试找出正确的方法来将数组初始化为所有零(即,就好像你在数组上做了一个memset)。
我在堆栈溢出(和其他源)的各个区域中发现了以下方法:
1 2 3 4 | char myArray1[10] = {0}; char myArray2[10] = {0,}; char myArray3[10] = {[0 ... 9] = 0}; char myArray4[10] = {0,0,0,0,0,0,0,0,0,0}; |
我更喜欢最简单的语法变体…我使用了0,但我没有找到任何证据证明这是正确的。
数组中缺少的元素将初始化为0。另外,C++允许你离开统一的初始化器空。因此,以下工作是最小的,也是最有效的:
1 | T array[N] = {}; |
值得注意的是,这适用于任何类型的
1 2 3 4 5 6 7 8 9 10 | #include <iostream> struct foo { foo() { std::cout <<"foo() "; } }; int main() { foo arr[5] = {}; } |
号
一段时间前,AIB公布了一份更广泛的不同可能性清单。
从C++规范,"聚合初始化"(8.5.1):
If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from an empty initializer list.
号
因此,不在初始值设定项列表中的每个
在C++ 11中,可以键入:
1 2 | char a[10] = {}; char b[10]{}; |
。
某些旧的编译器(或它在C中)可能要求您至少添加一个成员:
1 | char a[10] = {0}; |
当然,如果数组具有静态生存期(全局或静态变量),则如果没有初始值设定项,则将初始化为零:
1 | char global_array[10]; |
。
我觉得很困惑,所以我还是喜欢加上
关于尾随逗号,如果您执行以下操作,它将很有用:
1 2 3 4 5 | char a[] = { 1, 2, 3, }; |
。
这样,您就不必为最后一行设置特殊的大小写,也可以简化复制粘贴和差异操作。在您的特定情况下,这是无用的:
1 | char a[10] = {0,}; |
那个逗号什么也不做,而且很难看,所以我不会写。
我更喜欢这个,因为它简单而明确:
1 | char myArray1[10] = { 0 }; |