左值和右值

C 语言中有两个概念,一个是“左值”,另外一个是“右值”。

1.赋值目的

赋值表达式语句的目的是把值存储到内存上,其中:

  1. 用于存储值的数据区域统称为“数据对象”(这和面向对象的“对象”不同,C 只会在提及左右值概念的时候才会提及这个术语)
  2. 使用“变量名”是标识对象的一种方式,除此以外,指定数组的某元素、结构体的某成员、指针表达式也都可以作为对象的标识

2.左值右值

因此,沿着上述思路可以得到左右值得概念。

2.1.左值

左值:是可以用于标识或定位存储位置的标签。

  1. 左值指向一个对象,可以引用内存中的地址
  2. 左值可用在赋值运算符的左侧,也就叫左值(但是也同样可以放在赋值运算符得右侧)

但是由于 C 的某次新标准加入了 const 关键字,导致有时会不满足第二条规则,因此左值又根据第二条规则分为了“可修改左值”和“不可修改左值”(后者只能放在赋值符号的右边)。

也就是说,根据第一条判断是否为左值,第二条判断左值是否可以被修改。

2.2.右值

右值:是可以赋值给可修改左值的量,且本身不能是左值。右值只能放在右边,也就叫右值。右值无法被赋值,因此不可能在赋值符号的左边。

补充:我们举几个例子来判断左右值

int ex;		//创建左值(可修改),已经关联上某个特定内存
int why;	//创建左值(可修改),已经关联上某个特定内存
int zee;	//创建左值(可修改),已经关联上某个特定内存
const int TWO = 2;  	//创建出左值(不可修改)
why = 42;			   //将右值 42 赋值给左值(可修改)
zee = why;			   //将左值赋给左值
ex = TWO * (why + zee); //(why + zee) 整体是一个右值,不指定某个特定内存,也不能直接给其赋值,该式只是程序计算出来的临时值,计算完后就会被丢弃

因此左值和右值不能根据其位置是左还是右来简单认定,实际上这两个术语很容易被人所误会。

你可能感兴趣的:(C语言学习笔记,c++,开发语言)