为什么可修改的左值不能有数组类型?

从C11标准(§6.3.2.1左值,数组和函数指示符):

可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括,递归地,任何成员)或具有const限定类型的所有包含的聚合或联合的元素。

来自C in a Nutshell:

可修改的左值是一个左值,它未被声明为const限定的“类型限定符”(第180页),并且没有数组类型

可修改的左值不能有数组类型的原因是什么?

数组类型的对象总是隐式const吗?

C语言的设计者决定不应该按值分配数组。 当时这似乎是一个明智的决定(20世纪70年代早期) – 内存和处理器速度非常有限,他们认为a = b; 使ab都引用相同的数组是一个比a = b;更常见的意图a = b; 用于将一个数组的内容复制到另一个数组。

事实上,这已经是常见的用法:在B编程语言(C的前身)中,相当于int a[10]; 实际上意味着分配一个指针和一个10个整数的块,并将指针指向10个整数的块。 你实际上可以在B中的其他地方创建一个数组“点”。

C改变了数组定义的含义,它只分配了一个整数块; 并添加了“规则”:当您在赋值表达式(以及大多数其他表达式)中使用数组的名称时,数组将隐式转换为指向第一个元素的指针。 所以,如果a是指针而b是数组,那么你仍然可以写a = b; 使行为像b的别名。 虽然你不能再拥有a = b; 其中a是一个数组。

在1989年的第一个ANSI C标准中,他们添加了按值复制结构的能力(这在以前的某些编译器中已经存在但不是通用的),其结果是如果结构包含数组,则数组将按值复制。 但要回头改变a = b;的含义已经太晚了a = b; 按值复制数组,编写的代码太多,已经依赖于规则。

参考: C语言的发展 – Dennis M. Ritchie