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

时间:2017-08-13 00:52:17

标签: c

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

  

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

来自C in a Nutshell:

  

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

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

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

1 个答案:

答案 0 :(得分:3)

C语言的设计者决定不应该按值分配数组。当时这似乎是一个明智的决定(20世纪70年代早期) - 内存和处理器速度非常有限,他们认为让a = b;使ab都引用相同的数组是一回事这比使用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;的含义来按值复制数组已经太迟了,编写的代码太多已经依赖于规则了。

参考: The Development of the C Language - Dennis M. Ritchie

相关问题