几个术语:数据对象、左值、右值和运算符

在C语言中,类似这样的语句没有意义(实际上是无效的):
2002 = bmw
因为在这种情况下,2001被称为右值(rvalue),只能是字面常量。不能给常量赋值,常量本身就是它的值。因此,在编写代码时要记住,=号左侧的必须是一个变量名。实际上,赋值运算符左侧必须引用一个存储位置。最简单的方法就是使用变量名。

几个属于:数据对象、左值、右值和运算符

赋值表达式语句的目的是把值储存到内存位置上。用于储存值的数据存储区域称为数据对象(data object)。C标准只有在提到这个概念时才会用到对象这个术语。使用变量名是标识对象的一种方法。除此之外,还有其他方法。例如,可以指定数组的元素、结构的成员,或者使用指针表达式。左值(lvalue)是C语言的术语,用于标识特定数据对象的名称或表达式。因此对象指的是实际的数据存储,而左值是用于标识或定位存储位置的标签。

对于早期的C语言,提到左值意味着:

  1. 它指定一个对象,所以引用内存中的地址;
  2. 它可用在赋值运算符的左侧,左值(lvalue)中的l源自left。

但是后来,标准中新增了const限定符。用const创建的变量不可修改。因此,const标识符满足上面的第1项,但是不满足第2项。一方面C继续把标识对象的表达式定义左值,一方面某些左值却不能放在赋值运算符的左侧。有些左值不能用于赋值运算符的左侧。此时,标准对左值的定义已经不能满足当前的状况。
为此,C标准新增了一个术语:可修改的左值(modifiable lvalue),用于标识可修改的对象。所以,赋值运算符的左侧应该是可修改的左值。当前标准建议,使用术语对象定位值(object locator value)更好。
右值(rvalue)指的是能赋值给可修改左值的量,且本身不是左值。。例如,考虑下面的语句:
bmw = 2002;
这里,bmw是可修改的左值,2002是右值。读者也许猜到了,右值中的r源自right。右值可以是常量、变量或其他可求值的表达式。实际上,当前标准在描述这一概念时使用的是表达式的值(value of an expression),而不是右值。
在学习名称时,被称为”项“(如,赋值运算符左侧的项)的就是运算对象(operand)。运算对象是运算符操作的对象。

继续讨论:
通过声明变量来访问数据对象:
int entity = 3;
该声明创建了一个名为entity的标识符(identifier)。标识符是一个名称,在这种情况下,标识符可以用来指定(designate)特定对象的内容。标识符遵循变量的命名规则。在该例中,标识符entity即是软件指定硬件内存中的对象的方式。该声明还提供了存储在对象中的值。
变量名不是指定对象的唯一途径。考虑下面的声明:
int *pt = &entity;
int ranks[10];
第一行声明中,pt是一个标识符,它指定了一个储存地址的对象。但是,表达式*pt不是标识符,因为它不是一个名称。然而,它确实指定了一个对象,在这种情况下,它与entity指定的对象相同。一般而言,那些指定对象的表达式被称为左值。所以,entity既是标识符也是左值;*pt既是表达式也是左值。按照这个思路,ranks + 2 * entity 既不是标识符,也不是左值(它不指定内存位置上的内容)。但是表达式 *(ranks + 2 * entity)是一个左值,因为它的确指定了特定内存位置的值,即ranks数组的第7个元素。顺带一提,ranks的声明创建了一个可容纳10个int类型元素的对象,该数组的每个元素也是一个对象。
所有这些示例中,如果可以使用左值改变对象中的值,该左值就是一个可修改的左值。现在,考虑下面的声明:
const char *pc = "Behold a string literal!";
程序根据该声明把相应的字符串字面值储存在内存中,内含这些字符值的数组就是一个对象。由于数组中的每个字符都能被单独访问,所以每个字符也是一个对象。该声明还创建了一个标识符为pc的对象,储存着字符串的地址。由于可以设置pc重新指向其他字符串,所以标识符pc是一个可修改的左值。const只能保证被pc指向的字符串内容不被修改,但是无法保证pc不能指向别的字符串。由于*pc指定了储存’B’字符的数据对象,所以*pc是一个左值,但不是一个可修改的左值。于此类似,因为字符串字面值本身指定了储存字符串的对象,所以它也是一个左值,但不是可修改的左值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值