【发布时间】:2010-08-30 18:39:38
【问题描述】:
我正在尝试像这样初始化一个布尔数组:
bool FcpNumberIsOk[MAX_FCPS]={true};
但是当我调试它时,我只看到数组的第一个元素被初始化,其他的都是假的。怎么会这样?我在 ubuntu 10 上使用 Qt,初始化是在方法内的本地数组上完成的。
好的,谢谢你的回答。
【问题讨论】:
我正在尝试像这样初始化一个布尔数组:
bool FcpNumberIsOk[MAX_FCPS]={true};
但是当我调试它时,我只看到数组的第一个元素被初始化,其他的都是假的。怎么会这样?我在 ubuntu 10 上使用 Qt,初始化是在方法内的本地数组上完成的。
好的,谢谢你的回答。
【问题讨论】:
你误会了。您似乎认为任何未提及的元素都会被初始化为与最后一个显式初始化的值相同的值。您提到的最后一个值是true,因此所有其他元素也将初始化为true。我曾经也有同样的信念,但我很快就知道了。
这不是它的工作原理。任何未提及的元素都会被默认初始化,这对于 bool 意味着 false。
要将所有元素设置为true,请尝试类似std::fill_n:
std::fill_n(FcpNumberIsOk, MAX_FCPS, true);
【讨论】:
因为这就是 C++ 中数组初始化的工作方式。如果您没有为每个元素显式指定值,则该元素默认为零(或者,此处为 false)
bool FcpNumberIsOk[MAX_FCPS]={true, true, true, true /* etc */ };
注意
bool FcpNumberIsOk[MAX_FCPS];
将所有值设置为 false 或随机设置,具体取决于定义的位置。
【讨论】:
这是预期的行为。第一个元素初始化为指定值,其余元素初始化为默认值0:
int c[5] = {1};
// 1 0 0 0 0
for(int i = 0; i < 5; ++i)
std::cout << c[i] << ' ';
【讨论】:
因为你只显式初始化了数组的第一个元素,所以只有第一个元素被初始化,其余的都没有。
【讨论】:
int i[10] = {0};对数组进行0初始化是安全的。
true 和false 的混合,以及根本无效的bool 值。如果您初始化 any 元素,则 C++ 提供了一个 shorthand 来为其余元素提供默认值。这不是零效应。我认为让语言按照你(和我曾经)认为的方式工作是有好处的,但现在改变它为时已晚。那里的代码已经依赖于当前的行为。
使用这种语法,您只初始化第一个元素(使用您的值和其他 get default-one [false]),而不初始化其他元素。 您应该使用 int 数组和 memset 或 for 循环来初始化所有元素。
【讨论】:
memset 在大多数情况下都可以使用,但不可移植。 ::std::fill 更好,可以在 bool 数组上工作,并且在一个好的编译器上它会同样有效。