Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组不';t在c+中用大括号初始化+; 我正在学习C++,我遇到了以下奇怪的事情:_C++_Arrays - Fatal编程技术网

数组不';t在c+中用大括号初始化+; 我正在学习C++,我遇到了以下奇怪的事情:

数组不';t在c+中用大括号初始化+; 我正在学习C++,我遇到了以下奇怪的事情:,c++,arrays,C++,Arrays,如果我像书上说的那样初始化数组 int my_array[5] = {10} 每个数组字段仍然初始化为零,而它应该是10 如果我在循环中初始化它,它将按预期工作 发生了什么事?我正在使用Ubuntu,并使用g++编译。您观察到的是正确的:根据标准,数组的剩余项被初始化为0。当使用比数组小的列表初始化时,只有指定的元素按照您的预期被初始化;其余的初始化为0 要初始化所有值,请使用循环或,如图所示 在内部,std::fill\n相当于一个循环。从第一个链接: template <class

如果我像书上说的那样初始化数组

int my_array[5] = {10}
每个数组字段仍然初始化为零,而它应该是10

如果我在循环中初始化它,它将按预期工作


发生了什么事?我正在使用Ubuntu,并使用g++

编译。您观察到的是正确的:根据标准,数组的剩余项被初始化为0。

当使用比数组小的列表初始化时,只有指定的元素按照您的预期被初始化;其余的初始化为0

要初始化所有值,请使用循环或,如图所示

在内部,
std::fill\n
相当于一个循环。从第一个链接:

template <class OutputIterator, class Size, class T>
    OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
    while (n>0) {
        *first = val;
        ++first; --n;
    }
    return first;     // since C++11
}
模板
输出计数器填充n(输出计数器第一,大小n,常数T&val)
{
而(n>0){
*第一个=val;
++第一;--n;
}
返回第一个;//从C++11开始
}
C++03(假设Ubuntu系统上有较旧版本的GCC)标准说:

8.5.1/7

如果列表中的初始值设定项少于成员数 总的来说,每个未明确初始化的成员应 值已初始化(8.5)

数组是一个集合:

8.5.1/1

聚合是没有声明用户的数组或类(第9条) 构造函数(12.1),没有私有或受保护的非静态数据成员 (第11条),没有基类(第10条),也没有虚函数 (10.3)

至于初始化值意味着什么:

初始化T类型对象的值意味着:

-如果T是具有用户声明构造函数(12.1)的类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)

。。。跳过所有整数不是

-否则,对象初始化为零


对于
int

类型的变量,每个字段或第一个字段之后的每个字段会发生什么情况?只有第一个元素是10,其余的0实际上,第一个元素是10(我在检查数组内容时出错)@MarkoKacanski:我可以向您保证第一个数组元素,
my_array[0]
,初始化为
10
@MarkoKacanski:我不买。第一个元素是10,所有其他元素都是0是的,我认为这是正确的行为。我正在使用的教程说,通过使用数组[5]={0},可以将所有内容初始化为零。我错误地认为它可以处理所有值。@MarkoKacanski该方法对于值0是最佳的,因为编译器可能会以任何顺序分配所有值0,并从本质上优化自身。在增量for循环中执行同样的操作要差得多,因为您为所有元素指定了迭代器、顺序和值。然而,这是(据我所知)初始化为非零值的唯一方法。(
std::fill_n
内部工作原理相同)使用
={0}
与使用
={}
并让编译器隐式零初始化第一个元素是一样的。换句话说,当使用大括号时,您显式指定的任何值将仅将该字段初始化为该特定值,然后所有未指定的字段将改为零初始化。因此,如果你省略了第一个字段,编译器将为你简单地初始化它。Marko,你的书中所说的是真的,尽管如果这就是它在这个问题上所说的全部,它是误导性的。第一个元素初始化为零的原因与其余元素初始化为零的原因不同。你的书应该提到这种区别,也许是通过使用你在问题中引用的例子。我曾经和你假设的一样。这正是我想发布的支持信息。您是否有该标准的副本或查看一些在线资源?
template <class OutputIterator, class Size, class T>
    OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
    while (n>0) {
        *first = val;
        ++first; --n;
    }
    return first;     // since C++11
}