C 中的数组 - 左值与右值
Arrays in C - Lvalue vs. R-Value
我对 C 中 lValues 和 rValues 的定义以及数组的位置有疑问:
我一直认为数组,例如
int arr[10];
是不可修改的左值。但是,如果您将它们用作可修改的 lValues,例如这里:arr++;
,并尝试编译它,我没有收到预期的错误消息。消息是“需要左值作为增量操作数”。对于其他不可修改的左值,例如常量,消息是“只读变量的增量”。
这是为什么?
Any of the following C expressions can be l-value expressions:
- An identifier of integral, floating, pointer, structure, or union type
- A subscript ([ ]) expression that does not evaluate to an array
- A member-selection expression (-> or .)
- A unary-indirection (*) expression that does not refer to an array
- An l-value expression in parentheses
- A const object (a nonmodifiable l-value)
我想数组根本就不是左值。但是数组的下标(不是数组的数组!)是一个。
如果我们要尝试计算 arr++
,那么 C 2018 6.3.2.1 3 告诉我们 arr
首先转换为指向其第一个元素的指针:
Except when it is the operand of the sizeof
operator, or the unary &
operator, or is a string literal used to initialize an array, an expression that has type “array of type” is converted to an expression with type “pointer to type” that points to the initial element of the array object and is not an lvalue…
所以,如果我们进行转换然后处理 ++
,我们会发现 ++
的操作数只是一个值,而不是左值。因此,错误消息指出增量的操作数需要左值。
当然,编译器可以给出不同的信息; C 标准对于诊断消息中必须说的内容并不严格。
我对 C 中 lValues 和 rValues 的定义以及数组的位置有疑问: 我一直认为数组,例如
int arr[10];
是不可修改的左值。但是,如果您将它们用作可修改的 lValues,例如这里:arr++;
,并尝试编译它,我没有收到预期的错误消息。消息是“需要左值作为增量操作数”。对于其他不可修改的左值,例如常量,消息是“只读变量的增量”。
这是为什么?
Any of the following C expressions can be l-value expressions:
- An identifier of integral, floating, pointer, structure, or union type
- A subscript ([ ]) expression that does not evaluate to an array
- A member-selection expression (-> or .)
- A unary-indirection (*) expression that does not refer to an array
- An l-value expression in parentheses
- A const object (a nonmodifiable l-value)
我想数组根本就不是左值。但是数组的下标(不是数组的数组!)是一个。
如果我们要尝试计算 arr++
,那么 C 2018 6.3.2.1 3 告诉我们 arr
首先转换为指向其第一个元素的指针:
Except when it is the operand of the
sizeof
operator, or the unary&
operator, or is a string literal used to initialize an array, an expression that has type “array of type” is converted to an expression with type “pointer to type” that points to the initial element of the array object and is not an lvalue…
所以,如果我们进行转换然后处理 ++
,我们会发现 ++
的操作数只是一个值,而不是左值。因此,错误消息指出增量的操作数需要左值。
当然,编译器可以给出不同的信息; C 标准对于诊断消息中必须说的内容并不严格。