【问题标题】:Assign array to array将数组分配给数组
【发布时间】:2013-09-23 14:53:20
【问题描述】:

所以我在玩一些数组,但我不知道为什么这不起作用。

int numbers[5] = {1, 2, 3};
int values[5] = {0, 0, 0, 0, 0};
values = numbers; 

出现如下错误:

Error   1   error C2106: '=' : left operand must be l-value c:\users\abc\documents\visual studio 2012\projects\consoleapplication7\consoleapplication7\main.cpp 9   1   ConsoleApplication7

为什么我不能那样做?错误是什么意思?

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    由于 C++ 与 C 的向后兼容性,数组具有各种丑陋的行为。其中一种行为是数组不可赋值。请改用std::arraystd::vector

    #include <array>
    ...
    std::array<int,5> numbers = {1,2,3};
    std::array<int,5> values = {};
    values = numbers;
    

    如果由于某种原因必须使用数组,则必须通过循环或使用循环的函数复制元素,例如 std::copy

    #include <algorithm>
    ...
    int numbers[5] = {1, 2, 3};
    int values[5] = {};
    std::copy(numbers, numbers + 5, values);
    

    附带说明一下,您可能已经注意到我初始化 values 数组的方式有所不同,只是提供了一个空的初始化列表。我依赖于标准中的一条规则,即如果您为聚合提供初始化列表,无论多么部分,所有未指定的元素都是值初始化的。对于整数类型,值初始化意味着初始化为零。所以这两个是完全等价的:

    int values[5] = {0, 0, 0, 0, 0};
    int values[5] = {};
    

    【讨论】:

    • 如果数组是二维的,这会起作用吗?数字[5][10] 而不是数字[5]
    【解决方案2】:

    您不能在 C++ 中分配数组,这很愚蠢,但确实如此。您必须一一复制数组元素。或者你可以使用像memcpystd::copy 这样的内置函数。

    或者你可以放弃数组,改用std::vector。他们可以被分配。

    【讨论】:

      【解决方案3】:

      数组名是不可修改的左值,不能修改。

      values = numbers; 
      // ^
      // is array name
      

      读取编译器错误消息:"error C2106: '=' : left operand must be l-value" 一个 l-value is modifiable 可以出现在 = 的 lhs 处。

      您可以将数组名称分配给指针,例如:

      int* ptr = numbers;
      

      注意:数组名称是不变的,但你可以修改它的内容,例如value[i] = number[i]0 &lt;= i &lt; 5 的有效表达式。

      为什么我不能那样做?

      基本上这种约束是由语言强加的,内部数组名称用作基地址,通过使用基地址进行索引,您可以访问为数组分配的内容继续内存。因此,在 C/C++ 数组名称中,be 出现在 lhs 而不是左值。

      【讨论】:

      • "数组名称是常量而不是左值" 引用数组的名称是左值,因为所有引用函数、变量或数据成员的 id-expressions 都是左值 [ expr.prim.general]/8.这有点棘手:赋值运算符需要一个 modifiable 左值,但在 C++ 标准中没有定义,仅在 C 标准中定义:6.3.2.1/1“可修改的左值是没有数组类型的左值 [...]”。所以数组是左值,但不是可修改的左值,因此不能出现在赋值的左上角。
      • @DyP 是的,我明白我应该写“数组名称是常量,不可修改的左值””
      • @DyP 同样const i 是左值不可修改的左值,感谢通知现已更正。
      【解决方案4】:

      值 = 数字; 因为数字和值都是指针。

      int numbers[5] = {1, 2, 3};
      int values[5] = {0, 0, 0, 0, 0};
      for(int i = 0;i < 5; i ++){
          values[i] = numbers[i];
      }
      

      【讨论】:

      • numbersvalues 不是指针,它们是数组。我会先发制人地回应你的反对意见。数组不是指针(const 或其他)。数组名称不是指针(const 或其他)。数组就是数组,数组名是源代码中用来引用数组的字符序列。
      【解决方案5】:

      std::array 是个好主意,但这也是可能的:

      struct arr { int values[5]; };
      
      struct arr a{{1, 2, 3}};
      struct arr b{{}};
      
      a = b;
      

      否则,请使用std::memcpystd::copy

      【讨论】:

        【解决方案6】:

        我认为不可分配性的原因是 C 想要确保指向数组中任何元素的任何指针几乎始终保持有效。

        考虑允许动态调整大小的向量:旧指针在自动调整大小后变得无效(可怕地)。

        PS。使用向量的设计理念,以下代码块运行良好。

        vector<int> v = {1, 5, 16, 8};
        vector<int> v_2 = {7, 5, 16, 8};
        v_2 = v;
        

        【讨论】:

        • “确保指向数组中任何元素的任何指针几乎始终保持有效”这不适用于这里,因为他试图分配相同大小的数组。
        猜你喜欢
        • 2017-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 2014-07-17
        • 1970-01-01
        相关资源
        最近更新 更多