关于左值

引用自小甲鱼的教程

一般来说,当你看到这样的报错时

[Error] lvalue required as left operand of assignment

就是左值概念不清晰的原因啦

首先我们引用一下c99的官方文档

The name "lvalue" comes originally from the assignment expression E1 = E2, in which the left operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an object "locator value". What is sometimes called "rvalue" is in this International Standard described as the "value of an expression".

当然,装装样子而已啦,还是用汉语叙述:

左值也就是lvalue,更加合理的解释应该是locator value(特定位置的值),rvalue则应该理解为value of an expression(表达式的值)

以下面的代码为例:

#include <stdio.h>

int main()
{
int a = 5;

++(a++);

return 0;
}

这段代码是会报错的

如果你认为左值只是赋值运算左边的值,这个错误就无法理解了

正确的理解是:

(a++) 是先将变量 a 的值(5)做为整个表达式的值返回,再将 a 自增 1(类似于 a = a + 1)。

所以这里 ++(a++); 相当于 ++(5), a = a + 1;

那当然要报错啦,5 是一个常量,当然不能给你 5 = 5 + 1 咯~

++的作用对象需要是一个用于识别或定位储存位置的表示符(lvalue)

省流

C 语言的术语 lvalue 指用于识别或定位一个存储位置的标识符。(注意:左值同时还必须是可改变的)

其实 rvalue 的发明完全是为了搭配 lvalue,rvalue 你可以理解为 readable value,即任何可读取的值都被认为是右值(非左值)。