2013-09-23 109 views
13

所以我正在玩弄一些數組,我無法弄清楚爲什麼這不起作用。將數組分配給數組

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 

爲什麼我不能做這樣的?錯誤是什麼意思?

回答

20

由於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] = {}; 
6

你不能在C++中分配數組,它很愚蠢,但它是真的。您必須逐個複製數組元素。或者您可以使用內置函數,如memcpystd::copy

或者你可以放棄陣列,並使用std::vector來代替。他們可以被分配。

+0

+1使用std :: vector – Alex

2

數組名稱是不可修改的l值,您不能修改它。

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

讀取編譯器錯誤消息:"error C2106: '=' : left operand must be l-value"的L值是可修改可以在= LHS來出現。

您可以指定數組名的指針,如:

int* ptr = numbers; 

注:數組名是不變的,但你可以例如修改其內容value[i] = number[i]0 <= i < 5的有效表達式。

爲什麼我不能這樣做?

基本上這個約束是由語言強加的,內部數組名稱用作基地址,並且通過索引基地址可以訪問內容繼續爲數組分配內存。因此,在C/C++中,數組名稱出現在lhs而不是l值。

+0

「數組名稱常量不是l值」引用數組的名稱是左值,因爲所有引用函數,變量或數據成員的* id-表達式都是左值[ expr.prim.general]/8。這有點棘手:賦值運算符需要一個*可修改的*左值,但是它在C++標準中沒有定義,只在C標準中定義:6.3.2.1/1「一個可修改的左值是沒有的左值數組類型[...]「。所以一個數組是一個左值,但不是一個可修改的左值,因此不能出現在賦值的lhs中。 – dyp

+0

@DyP是的我明白我應該寫「數組名稱是不可修改的l值」 –

+0

@DyP類似地'const'' i'是l值不可修改的l值,由於現在通知已更正 –

0

values = numbers; 因爲數字和值是指針。

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]; 
} 
+0

'數字''和'values'不是指針,它們是數組,而且我會搶先回應你的反對意見。數組不是指針(const或其他)。數組名稱不是指針(const或其他)。數組是數組和數組名稱是用於引用源代碼中的數組的字符序列。 –

0

std::array是一個好主意,但是這也是可能的:

struct arr { int values[5]; }; 

struct arr a{{1, 2, 3}}; 
struct arr b{{}}; 

a = b; 

否則,使用std::memcpystd::copy