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

标签 c language-lawyer

来自 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; 使 ab 两者都引用同一个数组,这比使用 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; 的含义以按值复制数组已经太晚了,已经编写了太多已经依赖于规则的代码。

引用: The Development of the C Language - Dennis M. Ritchie

关于c - 为什么可修改的左值不能有数组类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45656162/

相关文章:

c - 为什么这段代码可以改变常量整数?

c - 用于传递多维数组的函数声明

c++ - 为什么 C++ 中强制 RVO 需要公共(public)析构函数?

C++-为什么这里需要 'template'关键字?

c++ - 为什么 UINTX_C() 宏没有在 Windows stdint.h 中正确定义?

lisp - Common Lisp 中的 '() 与 ()

c - 是否可以使用 C 中的单个消息队列进行双向通信

objective-c - 带有控制台应用程序的 EXC_BAD_ACCESS

c++ - 默认堆栈大小

我可以写入非常量结构的 const 成员吗?