关于c ++:将数组初始化为0的正确和最简单的语法方法

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] = {};

值得注意的是,这适用于任何类型的T,它可以是默认构造或初始化的,而不仅仅是内置类型。例如,以下工作,并将打印五次foo

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.

因此,不在初始值设定项列表中的每个char都将初始化为char(),即0

在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 };