2015-01-21 120 views
3

據我所知,C標準禁止使用陣列的作爲(修改)的左值,即,在賦值的左側:爲什麼數組不是左值?

int lhs[4], rhs[4] = {0, 1, 2, 3}; 
lhs = rhs; /* illegal! */ 

現在,我已經知道爲什麼是這種情況。我可以看到上面是聲明(和寫入到陣列的任何其他分配)定義相當於

memcpy((void *) lhs, (void *) rhs, sizeof(lhs)); 

氣派確保該rhs足夠大,用戶的負擔,但它不是決定這應該是這樣的。

然而,一個非常類似的例子確實工作完美的罰款:

struct { int a[4]; } lhs, rhs = {{0, 1, 2, 3, 4}}; 
lhs = rhs; 

只需通過包裹所述陣列中的結構,可以得到上述準確描述的行爲,即,分配lhs = rhs等同到:

memcpy((void *) &lhs, (void *) &rhs, sizeof(lhs)); 

這是什麼原因(我覺得)不一致?允許將數組賦值解釋爲memcpy s有什麼問題嗎?

+0

這裏回答了這裏:http://stackoverflow.com/a/17691191/14955(向下滾動到Edit2:真實原因) – Thilo 2015-01-21 02:13:30

+0

數組名稱*是一個左值。我想你問的是爲什麼數組不可分配。 – 2015-01-21 02:24:27

+0

可能的重複:http://stackoverflow.com/q/27881442/827263 – 2015-01-21 02:25:09

回答

2

C應該是一種低級語言,不會在簡單的語法之後隱藏潛在的內存或耗時的任務。一個操作員生成一個彙編指令;爲更復雜的東西調用一個函數。在C早期,你不能分配結構體,也不能在函數之間傳遞它們(你會傳遞一個指針)。

編輯:

一個結構是一個值。它的大小是靜態的,並且在編譯時已知。一個數組是多個值,並且大多數數組是動態分配/重新分配的。它們的大小在編譯時並不知道,所以編譯器不知道要分配和複製多少內存。

int *a, *b; 
a = malloc(/* value based on e.g. user input */); 
b = a; /* compile this into what? */ 

對於它的工作,C將不得不在內部存儲一個數組的大小連同指針或與指向的數據一起。這個決定留給了程序員。

+0

「早期C」是什麼意思?我知道每一個C *標準都允許賦值結構,所以你的論證對任何可以合理地被稱爲C的語言都是行不通的。除此之外,如果結構賦值確實在後來被添加到語言中,爲什麼不數組賦值也包括在內? – yyyyyyy 2015-01-22 16:41:44

+0

關於你的編輯:這是*不是*我正在談論的一個例子 - 你的代碼甚至不包含*數組,加上它編譯得很好(將* pointer *的值賦給*指針*'b')! – yyyyyyy 2016-05-06 15:30:21

相關問題