一、几个术语:数据对象、左值、右值和运算符
在C语言中,=并不意味着”相等“,而是一个赋值运算符。比如bmw = 2002;
把值2002赋给变量bmw。也就是说,=号左侧是一个变量名,右侧是赋给该变量的值。在C语言中,类似2002 = bmw;
这样的句子没有意义(实际上是无效的)。因为这种情况下,2002被称作 右值(rvalue),只能是字面常量,不能给常量赋值,常量本身就是它的值。
因此,在编写代码时要记住,=号的左侧必须是一个变量名。实际上,赋值运算符的左侧必须引用一个存储位置。
概括地说,C使用**可修改的左值(modifiable lvalue)**标记那些可赋值实体。”可修改的左值“这个概念可能不太好懂,我们再来看一些定义。
1.数据对象
赋值表达式的目的是把值存储到内存位置上。 用于存储值的数据存储区域统称数据对象(data object)。C标准只有提到这个概念时才会用到对象这个术语。
使用变量名是标识对象的一种方法。
2.左值
**左值(lvalue)**是C语言的术语,用以标识特定数据对象的名称或表达式。因此,对象指的是实际的数据存储,而左值是用于标识特定或定位存储位置的的标签。
对于早期的C语言,提到左值意味着:
- 它可以指定一个对象,可以引用内存地址中的值;
- 它可以用在赋值运算符的的左侧,左值中的l来源于left。
但是后来,标准中新增了const限定符,用const创建的变量不可修改。因此,const标识符满足上面的第1项,但是不满足第2项。一方面,C继续把标识对象的表达式定义为左值,一方面某些左值却不能放在赋值运算符的左侧。
为此,C新增了一个术语可修改的左值(modifiable lvalu