数组初始化有一个很好的数组初始化列表。我有一个

int array[100] = {-1};

期望它充满-1,但它不是,只有第一个值是,其余都是0和随机值的混合。

的代码

int array[100] = {0};

工作很好,并将每个元素设置为0。

我错过了什么…如果值不为零,就不能初始化它吗?

和2:是默认的初始化(如上所述)比通常的循环通过整个数组和赋值还是做同样的事情?


当前回答

用你用过的语法,

int array[100] = {-1};

表示“将第一个元素设置为-1,其余为0”,因为所有省略的元素都设置为0。

在c++中,要将它们都设置为-1,你可以使用类似std::fill_n (from <algorithm>):

std::fill_n(array, 100, -1);

在便携式C语言中,你必须自己进行循环。有编译器扩展,或者如果可以接受,可以依赖实现定义的行为作为快捷方式。

其他回答

另一种将数组初始化为公共值的方法是实际生成一系列定义中的元素列表:

#define DUP1( X ) ( X )
#define DUP2( X ) DUP1( X ), ( X )
#define DUP3( X ) DUP2( X ), ( X )
#define DUP4( X ) DUP3( X ), ( X )
#define DUP5( X ) DUP4( X ), ( X )
.
.
#define DUP100( X ) DUP99( X ), ( X )

#define DUPx( X, N ) DUP##N( X )
#define DUP( X, N ) DUPx( X, N )

将数组初始化为一个公共值很容易做到:

#define LIST_MAX 6
static unsigned char List[ LIST_MAX ]= { DUP( 123, LIST_MAX ) };

注意:引入DUPx是为了在参数中对DUP进行宏替换

1)当你使用初始化式时,对于一个结构或数组,未指定的值本质上是默认构造的。对于像int这样的基本类型,这意味着它们将被归零。注意,这是递归应用的:你可以有一个包含数组的结构体数组,如果你只指定第一个结构体的第一个字段,那么其余的都将用0和默认构造函数初始化。

2)编译器生成的初始化代码至少和你手工编写的一样好。如果可能的话,我倾向于让编译器为我进行初始化。

使用{}可以在声明元素时赋值;其余部分初始化为0。

如果没有={}来初始化,则内容是未定义的。

c++ 11还有另一个(不完善的)选项:

std::array<int, 100> a;
a.fill(-1);

gcc编译器有一个扩展,允许以下语法:

int array[100] = { [0 ... 99] = -1 };

这将把所有元素都设为-1。

这被称为“指定初始化器”,更多信息请参见这里。

注意,这不是gcc c++编译器实现的。