来自 C11 标准(§6.3.2.1 左值、数组和函数指示符):
A modifiable lvalue is an lvalue that does not have array type, does not have an incomplete type, does not have a const-qualified type, and if it is a structure or union, does not have any member (including, recursively, any member or element of all contained aggregates or unions) with a const-qualified type.
简而言之,来自 C:
A modifiable lvalue is an lvalue that is not declared as a const -qualified “Type Qualifiers” on page 180), and that does not have an array type.
可修改的左值不能有数组类型的原因是什么?
数组类型的对象是否总是隐式常量?
最佳答案
C 语言的设计者决定不可能按值分配数组。当时这似乎是一个明智的决定(1970 年代初期)- 内存和处理器速度非常有限,他们认为让 a = b;
使 a
和 b
两者都引用同一个数组,这比使用 a = b;
将一个数组的内容复制到另一个数组更常见。
事实上,这已经是常见的用法:在 B 编程语言(C 的前身)中,相当于 int a[10];
实际上意味着分配一个指针和一个 block 10 个整数,并将指针指向 10 个整数的 block 。实际上,您可以在 B 中的其他地方创建一个数组“点”。
C 改变了数组定义的含义,它只分配整数 block ;并添加了“规则”:当您在赋值表达式(以及大多数其他表达式)中使用数组的名称时,数组将隐式转换为指向第一个元素的指针。因此,如果 a
是一个指针而 b
是一个数组,那么您仍然可以编写 a = b;
来生成 a
的行为类似于 b
的别名。尽管您不能再使用 a = b;
,其中 a
是一个数组。
在 1989 年的第一个 ANSI C 标准中,他们添加了按值复制结构的能力(这在以前的一些编译器中存在,但不是通用的),推论是如果结构包含一个数组,那么该数组将被复制按值(value)。但是要回过头来改变 a = b;
的含义以按值复制数组已经太晚了,已经编写了太多已经依赖于规则的代码。
关于c - 为什么可修改的左值不能有数组类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45656162/