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中文網其他相關文章!