2017-08-13 41 views
3

从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.

从下在果壳:

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.

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

是一个数组类型的对象总是隐const的?

+3

您可以分配到可修改的左值;你不能分配给数组(只能分配给数组元素),所以数组名不能是可修改的左值。 –

+0

谢谢。函数名称是否具有与数组名称类似的行为?但函数名称不是左值或非值。左值和非值都只能是一个对象表达式。 – Tim

+0

在某些方面,函数名称就像数组名称;你当然不能分配给一个函数名 - 但你可以用它来调用一个函数或初始化一个函数指针。名称'可修改左值'的意思是你可以在赋值中使用'lvalue = rvalue;'。 –

回答

1

C语言的设计者认为它不应该是可能通过价值来分配阵列。当时这似乎是一个明智的决定(70年代初) - 内存和处理器速度是非常有限的,他们认为有a = b;使ab都指向同一个数组是什么,这将是一个更为普遍的意图不必a = b;是用于将一个数组的内容复制到另一个数组。

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

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

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

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

相关问题