首页 >后端开发 >C++ >为什么在 C 和 C 中结构体中允许数组赋值,但独立数组则不允许?

为什么在 C 和 C 中结构体中允许数组赋值,但独立数组则不允许?

Linda Hamilton
Linda Hamilton原创
2024-12-24 21:48:15284浏览

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