Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
C++ C++;将数据分配给类似数组的初始化_C++ - Fatal编程技术网

C++ C++;将数据分配给类似数组的初始化

C++ C++;将数据分配给类似数组的初始化,c++,C++,为什么我们可以用 int a[]={1,2,3}; 但我们无法将数据分配给现有阵列 a = {2,3,4}; ? 是否可以创建一个以常量数组为参数的函数,并调用它以在一行中分配变量 伪代码: int a[] = {1,2,3}; myfunc(a, (int){2,3,4}); void myfunc(int &array1, const int array2) { copy(array2,array1); } 因为C-array不能做到这一点。 C数组没有可用的赋值运算

为什么我们可以用

int a[]={1,2,3};
但我们无法将数据分配给现有阵列

a = {2,3,4};
?

是否可以创建一个以常量数组为参数的函数,并调用它以在一行中分配变量

伪代码:

int a[] = {1,2,3};
myfunc(a, (int){2,3,4});

void myfunc(int &array1, const int array2)
{
    copy(array2,array1);
}

因为C-array不能做到这一点。 C数组没有可用的赋值运算符。 理性纯粹是历史的。首先,当时的记忆非常有限。创建一个易于复制阵列的功能被认为是内存和时间的一个腰围,所以它不是一个优先事项。事实上,确保数组通过指针传递(更重要的是不通过值)更重要,这就是为什么C和C++中的数组会退化为指针值。当时大多数其他语言也没有这种能力。后来,向后可比性开始流行,而这种特征从未被引入

在可能的情况下,使用更现代的
std::array

std::数组a{1,3,4,-2};
a={-4,-2,0,0};

因为C-array无法做到这一点。 C数组没有可用的赋值运算符。 理性纯粹是历史的。首先,当时的记忆非常有限。创建一个易于复制阵列的功能被认为是内存和时间的一个腰围,所以它不是一个优先事项。事实上,确保数组通过指针传递(更重要的是不通过值)更重要,这就是为什么C和C++中的数组会退化为指针值。当时大多数其他语言也没有这种能力。后来,向后可比性开始流行,而这种特征从未被引入

在可能的情况下,使用更现代的
std::array

std::数组a{1,3,4,-2};
a={-4,-2,0,0};

是的,您可以编写一个函数模板来推断数组的大小

template<size_t N>
void myfunc(int (&a)[N], int const (&b)[N])
{
  std::copy(b, b + N, a);
}
模板
void myfunc(整型(&a)[N],整型常量(&b)[N])
{
标准::副本(b,b+N,a);
}
请注意,这允许根据需要从brace init列表推导第二个参数。另外一个优点是,您不会弄错尺寸

现在您可以在一行中复制

int main()
{
  int a[] = {1,2,3};

  for (auto i : a)
    std::cout << i;  // 1 2 3 

  myfunc(a, {2,3,4});

  for (auto i : a)
    std::cout << i;  // 2 3 4


  myfunc(a, {2,3,4,5});  // error, as it should be
}
intmain()
{
int a[]={1,2,3};
用于(自动i:a)

是的,您可以编写一个函数模板来推断数组的大小

template<size_t N>
void myfunc(int (&a)[N], int const (&b)[N])
{
  std::copy(b, b + N, a);
}
模板
void myfunc(整型(&a)[N],整型常量(&b)[N])
{
标准::副本(b,b+N,a);
}
请注意,这允许根据需要从brace init列表推断第二个参数。另一个优点是,您不会得到错误的大小

现在您可以在一行中复制

int main()
{
  int a[] = {1,2,3};

  for (auto i : a)
    std::cout << i;  // 1 2 3 

  myfunc(a, {2,3,4});

  for (auto i : a)
    std::cout << i;  // 2 3 4


  myfunc(a, {2,3,4,5});  // error, as it should be
}
intmain()
{
int a[]={1,2,3};
用于(自动i:a)

std::cout数组被视为常量指针,而常量不是assignable@asmmo事实并非如此。数组既不是[固有]常量,也不是[永远]指针。数组被视为常量指针,而常量不是assignable@asmmo事实并非如此。数组既不是[固有的]常量,也不是[永远的]指针。这并不能真正回答为什么。C++可以拥有它,为什么C没有它呢?但是,它并不能真正回答为什么。C++可以拥有它,为什么C没有它?有可能自动调整数组到不同数量的值吗?不。数组的大小是它的一部分。它必须在编译时知道,不能是C。在程序期间挂起。是否可以将数组自动调整为不同数量的值?否。数组的大小是其类型的一部分。它必须在编译时已知,并且在程序期间不能更改。