【发布时间】:2021-04-20 18:27:58
【问题描述】:
示例代码:
int a[10]={0};
a = (void *) 0; // error: assignment to expression with array type
primary-expression:
identifier
constant
string-literal
( expression )
和6.3.2.1 Lvalues, arrays, and function designators
左值是具有对象类型或除 void 之外的不完整类型的表达式; 如果左值在评估时未指定对象,则行为未定义。 当一个对象被称为具有特定类型时,该类型由用于 指定对象。 可修改的左值是没有数组类型的左值,有 没有不完整的类型,没有 const 限定的类型,并且如果它是一个结构 或联合,没有任何成员(包括,递归地,任何成员或元素 所有包含的聚合或联合)具有 const 限定类型。
我们知道a 和(void *) 0 都是左值表达式,a 有一个类型数组。
如果我们看下面的定义:
除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是 用于初始化数组的字符串字面量,类型为“array of type”的表达式是 转换为类型为“pointer to type”的表达式,该表达式指向 数组对象并且不是左值。如果数组对象有寄存器存储类,则 行为未定义。
看起来a 的类型从array of int 转移到pointer to array of int,它变成了“可修改的左值”。但是我的 gcc 9.3.0 说:
error: assignment to expression with array type"
我很困惑。
【问题讨论】:
-
"看起来
a的类型从array of int转移到pointer to array of int" - 不,它衰减变成了pointer to int.pointer to array of int是完全不同的东西。 “它变成了“可修改的左值””——不,在这种情况下它不会。 数组衰减 仅在某些情况下发生(例如将数组传递给函数参数,或将其分配给变量),但这不是其中之一。因此,一旦数组初始化,就不能将 anything 分配给数组本身,只能分配给它的元素。 -
(void *) 0在我看来不像左值 -
@RemyLebeau 感谢您的指正。函数声明中数组衰减的说明见
6.7.5.3 Function declarators。
标签: c types expression c99