来自 C11 标准(第 6.3.2.1 节左值、数组和函数指示符):
甲修改的左值是不具有阵列型左值,不具有不完整的类型,不具有常量限定类型,并且如果它是一个结构或联合,没有任何构件(包括,递归,任何部件或所有包含的聚合或联合的元素)具有 const 限定类型。
简而言之,来自C:
可修改的左值是未声明为 const 限定的“类型限定符”(第 180 页)且不具有数组类型的左值。
可修改的左值不能具有数组类型的原因是什么?
数组类型的对象总是隐式 const 吗?
C 语言的设计者决定不能按值分配数组。在当时,这似乎是一个明智的决定(1970 年代初期)——内存和处理器速度非常有限,他们认为让a = b;makea和b两者都引用同一个数组比a = b;用于复制数组更常见。一个数组的内容到另一个。
事实上,这已经是常见的用法:在 B 编程语言(C 的前身)中,相当于int a[10];实际上意味着分配一个指针和一个 10 个整数的块,并将指针指向 10 个整数的块。你实际上可以在 B 的其他地方创建一个数组“指向”。
C 改变了数组定义的含义,它只分配整数块;并添加了“规则”:当您在赋值表达式(和大多数其他表达式)中使用数组的名称时,数组将隐式转换为指向第一个元素的指针。因此,如果a是一个指针并且b是一个数组,那么您仍然可以编写a = b;make 的a行为就像b. 虽然你不能再有a = b;wherea是一个数组。
在 1989 年的第一个 ANSI C 标准中,他们添加了按值复制结构的能力(这在以前的一些编译器中存在但不通用),推论如果结构包含数组,则数组将按值复制。但是回过头来改变a = b;按值复制数组的含义已经太晚了,编写了太多已经依赖于 The Rule 的代码。
参考:C 语言的发展 - Dennis M. Ritchie
| 归档时间: |
|
| 查看次数: |
1054 次 |
| 最近记录: |