为什么仅在结构体中支持数组成员赋值
与一般数组不同,结构中定义的数组享受成员赋值。虽然不允许将一个数组分配给另一个数组 (__
num1 = num2;//),但它在结构中变得可行 (
struct1 = struct2;//< ;/pre>__),如下图:<pre class="brush:php;toolbar:false">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 的演变。在早期迭代中,数组本质上是没有大小信息的指针。这阻碍了他们的分配,因为编译器缺乏必要的数据。然而,结构内的数组受益于特殊的处理,从封闭的结构继承其类型和大小信息。因此,它们可以在结构体的上下文中按成员进行分配,而不受一般约束的影响。
这种做法被延续到现代 C 和 C 中,这是一个解决分配开放数组的实现挑战的怪癖。引入通用数组分配会带来歧义和兼容性问题。因此,限制得以保留,并鼓励程序员使用 memcpy 进行显式数组复制。
异常
函数参数已成为数组成员可以的另一种设置分配的。考虑以下代码:
typedef int vec[3]; void f(vec a, vec b) { a = b; // pointer assignment }
虽然 a 是指针参数,但赋值有效地执行了按元素复制,尽管位于结构之外。此异常本质上是一种增强功能,允许在函数调用中使用值语义。
以上是为什么我不能直接为数组赋值,但可以在 C/C 中的结构体中赋值?的详细内容。更多信息请关注PHP中文网其他相关文章!