C++ C++;数组初始化不工作
我正在尝试初始化布尔数组,如下所示:C++ C++;数组初始化不工作,c++,arrays,gcc,C++,Arrays,Gcc,我正在尝试初始化布尔数组,如下所示: bool FcpNumberIsOk[MAX_FCPS]={true}; 但是当我调试它时,我只看到数组的第一个元素被初始化,其他元素都是false。怎么会这样?我在Ubuntu10上使用Qt,初始化是在方法内部的本地数组上完成的 >谢谢你的回答。因为你已经明确地初始化了数组的第一个元素,只有第一个元素被初始化,其余的不是.< /p> ,因为这是数组初始化在C++中工作的方式。如果没有显式地为每个元素指定一个值,则该元素默认为零(或者,这里为false)
bool FcpNumberIsOk[MAX_FCPS]={true};
但是当我调试它时,我只看到数组的第一个元素被初始化,其他元素都是false。怎么会这样?我在Ubuntu10上使用Qt,初始化是在方法内部的本地数组上完成的
<> >谢谢你的回答。因为你已经明确地初始化了数组的第一个元素,只有第一个元素被初始化,其余的不是.< /p> ,因为这是数组初始化在C++中工作的方式。如果没有显式地为每个元素指定一个值,则该元素默认为零(或者,这里为false) 注意
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] << ' ';
intc[5]={1};
// 1 0 0 0 0
对于(int i=0;i<5;++i)
std::cout使用此语法,您只初始化第一个元素(使用您的值和其他get default one[false]),而不初始化其他元素。
您应该使用int-array和memset或for-loop来初始化所有元素。您误解了。您似乎认为,任何未提及的元素都将被初始化为与上次显式初始化的值相同的值。您提到的最后一个值是true
,因此所有其他元素也将初始化为true
。我曾经有过同样的信念,但我很快就明白了
这不是它的工作原理。任何未提及的元素都会得到默认初始化,这对于bool
意味着false
要将所有元素设置为true
,请尝试类似std::fill\n
:
std::fill_n(FcpNumberIsOk, MAX_FCPS, true);
其余部分初始化为默认值0。这就是为什么使用inti[10]={0}是安全的代码>到0-初始化数组。实际上所有元素都会初始化。标准规定所有剩余的元素都被设置为0。@meagar你怎么能说“int i[10]={0}”除了在第一个元素上设置0之外还有其他作用。@yan我很肯定他会这么说,因为这就是语言的工作方式。但是@yan,默认情况下它还没有被使用。如果您根本没有给出任何初始值设定项,那么数组(通常)是未初始化的。数组可能包含true
和false
的组合,以及根本无效的bool
值。如果初始化任何元素,那么C++提供了对其余元素提供默认值的快捷方式。这不是零效应。我认为让语言像你(和我曾经)认为的那样工作是有好处的,但是现在改变它已经太晚了。那里的代码已经依赖于当前的行为。实际上所有的元素都被初始化了。标准规定所有剩余的元素都设置为0。我的意思是。好吧,我错了。memset
在大多数情况下都可以工作,但不可移植<代码>::std::fill
更好,可以在bool
数组上工作,在一个好的编译器上它也同样有效。我在msvc上使用std::copy with vectors的经验不太好。因此,为了提高效率,我使用了memcpy和memset函数。速度是100%快。但是,是的,我对它们总是非常小心。第二个版本是什么时候初始化的?我认为只有当您显式默认初始化包含类/struct?@jdv时,如果您将变量定义为具有静态存储持续时间(本地/类静态,命名空间范围变量),则在程序启动时,它在发生任何其他事情之前初始化为零。看见
std::fill_n(FcpNumberIsOk, MAX_FCPS, true);