c 不提供陣列賦值語法的理由是什麼

時間 2021-05-10 06:24:30

1樓:毛兔子和青蛙

其實我覺得陣列不能賦值是堅持統一的原則的。這個原則就是在c++中,我們所有的操作都必須是針對乙個物件或者乙個單獨的變數的。

比如說,std::array,他定義出來的其實是乙個物件,我們可以對這個物件進行相應的操作。

而陣列不是,陣列是一組相同型別變數的集合,也就是多個變數,c++就阻止了這種同時對多個變數處理的行為。

同樣的,我們常說的鍊錶概念,也是沒有賦值的。但std::list支援賦值,因為std::list構建的是乙個物件,而普通鍊錶是乙個集合。

同樣的,在c語言時代,直接給結構體賦值也是不準確的,而是需要乙個乙個賦值。在c++中可以直接賦值是因為有預設拷貝控制函式。

2樓:凌人

只有原始陣列不能這麼做,C++ 保持和 C 的相容性。

u32 a[10]; // -> u32 * const

u32 b[10]; // -> u32 * const

a = b; // error! 指標常量不能被賦值,此時 a, b 語義為指標

u32 * const ptr = a; // 指標常量只能在初始化時賦值,之後就不能改了

ptr = a; // error 上面 a = b 錯誤的原因與此同理

如果 a = b 的語義是 a[0:9] = b[0:9] 的陣列元素拷貝,那麼 a = b 就會和 ptr = a 產生二義性,而大多時候在陣列傳參使用的是指標,而 C 語言之父也沒有打算用 a[0:

9] = b[0:9] 作為陣列賦值的語法,所以定義後的陣列自然就順理成章是乙個指標型別,而代替賦值操作的則是類似 memcpy 這樣的函式

但是時代變了,自 C++ 模板推出以來已經過了十多二十年,是時候步入現代 C++ 了,C++11 也算是乙個里程碑意義的版本,可以學習一下常用的模板類,實時更新自己的知識庫。

std::array a, b;

a = b; // 值拷貝

// std::vector c, d;

// c = d; // **不是** 引用拷貝 <- 糾正,看了下原始碼突然意識到 std::vector 不是基於引用計數器實現的。

std::shared_ptr> c, d;

c = d; // 引用拷貝

3樓:d41d8c

C++允許陣列賦值,所有實現都錯了。(暴論)

[expr.ass]沒有一處禁止陣列賦值。賦值對於左運算元的要求是

All require a modifiable lvalue as their left operand

而「modifiable lvalue」的定義是([basic.lval] )

An lvalue is modifiable unless its type is const-qualified or is a function type.

顯然非const陣列變數名屬於modifiable lvalue,因此符合賦值運算子的要求。

所以去給編譯器提bug report吧

4樓:黎潘達

陣列賦值要知道陣列的長度,你把代表陣列的識別符號拿來用的時候,它就已經坍縮成指標了,失去了長度資訊。再說你覺得這個語法應該在記憶體中產生什麼效果?

另外標準模板庫的陣列作為一般容器是有賦值語法的。

5樓:雪凰

當初C語言,基於對程式設計師的信任,沒有陣列越界檢查,內建陣列在執行時自然沒有長度資訊,故而沒法賦值了。

陣列一般不會進行拷貝,太浪費效能了,多數情況都是傳指標,這樣看來陣列的變數名會自動退化為指標反而更方便了。

如果非要賦值功能,可以看看std::array。

C語言中 陣列可以從下標為1開始賦值嗎?

DK菌 從標準來講是可以的,隨便從任何乙個大於等於0的下標開始都可以 但一般不這麼幹,C呼叫別的函式傳遞陣列時容易出問題,因為一般遍歷陣列從0開始,那麼 0 就多出來了,要是用指標和整型傳遞陣列就容易導致缺乙個元素 對於C 風格字串是絕對不行的,如果字串已初始化為0,那麼 0 的值就是0即 0 在A...

對一維陣列的5個元素進行賦值,之後將其依次往後移乙個位置,再將第五個資料放在第乙個儲存單元並輸出?

筱傑 題目沒說用什麼程式語言,我就用C寫了兩個版本。版本一 完全符合題意要求的寫法 include intmain int argc const item t argv intn sizeof array sizeof array int temp array n 1 for inti n 1 i ...

為什麼賣耳機的都不提供頻響曲線?

星城 老傢伙懈怠中 咳咳,旁友,這裡是知乎啊,先問是不是,再問為什麼啊。建議修改提問哦。咱不說名頭太響的,文具廠出的極樂鳥在包裝盒上就印了頻響曲線的。 秋未萌 不請自來!買鞋子需要尺碼,買衣服需要尺寸,那麼買耳機就需要 頻響曲線 嗎?咱認為是可以有,但是並沒有必要 或者說消費級耳機似乎已經陷入了一股...