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中文网其他相关文章!