来自C11标准(§6.3.2.1左值,数组和函数指示符):
可修改的左值是一个左值 没有数组类型,没有不完整的类型,没有const限定 类型,如果是结构或联合,则没有任何成员(包括, 递归地,所有包含聚合或联合的成员或元素具有const限定 类型。
来自C in a Nutshell:
可修改的左值是一个未声明为const的左值 限定的“类型限定符”(第180页),并且没有数组类型。
可修改的左值不能有数组类型的原因是什么?
数组类型的对象是否总是隐式const?
答案 0 :(得分:3)
C语言的设计者决定不应该按值分配数组。当时这似乎是一个明智的决定(20世纪70年代早期) - 内存和处理器速度非常有限,他们认为让a = b;
使a
和b
都引用相同的数组是一回事这比使用a = b;
将一个数组的内容复制到另一个数组更常见。
实际上这已经是常见的用法:在B编程语言(C的前身)中,相当于int a[10];
实际上意味着分配一个指针和一个10个整数的块,并将指针指向10个整数块。你实际上可以在B中的其他地方创建一个数组“点”。
C改变了数组定义的含义,它只分配了一个整数块;并添加了“规则”:当您在赋值表达式(以及大多数其他表达式)中使用数组的名称时,数组将隐式转换为指向第一个元素的指针。因此,如果a
是指针且b
是数组,那么您仍然可以编写a = b;
以使a
的行为类似b
的别名。虽然您不能再a = b;
a
是一个数组。
在1989年的第一个ANSI C标准中,他们添加了按值复制结构的能力(这在以前的某些编译器中已经存在但不是通用的),结果是如果结构包含数组,则数组被复制按价值。但是要回过头来改变a = b;
的含义来按值复制数组已经太迟了,编写的代码太多已经依赖于规则了。