首頁 >後端開發 >C++ >為什麼在 C 和 C 中結構體中允許數組賦值,但獨立數組則不允許?

為什麼在 C 和 C 中結構體中允許數組賦值,但獨立數組則不允許?

Linda Hamilton
Linda Hamilton原創
2024-12-24 21:48:15287瀏覽

Why are Array Assignments Allowed Within Structs but Not for Standalone Arrays in C and C  ?

C 和 C 語言中的陣列賦值:結構和哲學見解的例外

在 C 和 C語言中,禁止直接將數組賦值,如下所示透過以下方式:

int num1[3] = {1,2,3};
int num2[3];
num2 = num1; // Error: invalid array assignment

但是,當數組是結構體的組件時會出現異常:

struct myStruct { int num[3]; };
struct myStruct struct1 = {{1,2,3}};
struct myStruct struct2;
struct2 = struct1;

在這種情況下,結構體中的陣列可以依成員分配。這就提出了一個問題:為什麼結構支援按成員進行數組賦值,但普遍不支持。

演化原理

陣列行為的起源在於歷史發展C 的。在 B 和 BCPL 中,陣列被隱式地視為無類型指標。 B 中的結構需要特殊處理來容納數組,這導致結構內的數組被處理為編譯器追蹤的實體。

這通常需要禁止陣列賦值,因為這需要重新評估陣列的基底指標。為了保持相容性,即使對於結構體中的數組,也不允許進行數組賦值。

結構體賦值和副作用

當結構體賦值在 C 中引入時,它被實現為結構體原始記憶體的簡單 memcpy。這種賦值行為無意中擴展到了結構中的陣列。

由於結構賦值已經是該語言的一部分,任何更改陣列賦值行為的嘗試都可能會破壞現有程式碼。因此,結構體中的陣列賦值仍然是一個例外,儘管這是一個意外的情況。

哲學觀點

從語言設計的角度來看,可以說陣列不同於結構體,從來就不是一等公民。它們作為指針的功能優先考慮向後相容性,而不是潛在的人體工學優勢。

此外,引入通用陣列分配會帶來複雜性,例如意外建立指標和記憶體洩漏的可能性。

結論

結構體中對成員數組賦值的支持是源自於 C 早期演變的歷史產物。由於相容性問題而一直存在,並提醒人們該語言的基本設計理念是優先考慮簡單性和向後相容性。

以上是為什麼在 C 和 C 中結構體中允許數組賦值,但獨立數組則不允許?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn