左值表达式 右值表达式(C/C++)

何谓对象?

这里所说的对象是广义上的,而不仅仅是狭义的类/对象(class/object)。

C/C++,所谓的对象指的是执行环境中一块存储区域(a region of storage),
该存储区域中的内容代表了该对象的值(value)。注意到我们这里所说的"
",对于一个对象,如果我们需要取出它的值,那么我们需要通过一定的

类型(type)来引用它。使用不同的类型,对同一对象中的内容的解释会导致

可能得到不同的值,或者产生某些未定义的行为。

 何谓变量?

 经常有人会把变量与对象二者混淆。所谓变量是一种声明,通过声明,

把一个名字与一个对象对应起来,当我们使用该名字时,就表示了我们对该

对象进行某种操作。但是并不是每个对象都有名字,也并不意味着有对应的

变量。比如临时对象(temporary object)就没有一个名字与之关联(不要误称

为临时变量,这是不正确的说法)。

左值 右值

先看一个例子(出自《C专家编程》)

一个赋值表达式:      X = Y;

在这个表达式里,符号X的含义是X所代表的地址,这被称为左值,左值

在编译时可知,左值表示存储结果的地方;

在这个表达式里,符号Y的含义是Y所代表的地址的内容,这被称为右值,

右值在运行时才可知,如无特别说明,右值表示“Y的内容

按照C的定义,左值是一个引用到对象的表达式,通过左值我们可以取出

该对象的值。通过可修改的左值表达式(modifiable lvalue)我们还可以修改

该对象的值。(需要说明的是,在C++中,左值还可以引用到函数,即表达

式f如果引用的是函数类型,那么在C中它既不是左值也不是右值;而在

C++中则是左值)。因为左值引用到某一对象,因此我们使用&对左值表

达式(也只能对左值表达式和函数)取址运算时,可以获得该对象的地址

(有两种左值表达式不能取址,一是具有位域( bit-field )类型,因为实现中

最小寻址单位是 byte;另一个是具有register指定符,使用register修饰的变

量编译器可能会优化到寄存器中).

  与左值相对应的另一个概念是右值(rvalue)。在C中,右值也用表达式的

值(value of the expression)来表达。即右值强调的不是表达式本身,而是

该表达式运算后的结果。这个结果往往并不引用到某一对象,可以看成

计算的中间结果;当然它也可能引用到某一对象,但是通过该右值表达

式我们不能直接修改该对象。

关于++i 和 i++

 ++i的实现:++i是直接给i变量加1,然后返回i本身,因为i是变量,

所以可以被赋值,

         即  int & ++(& i)
 {
  i=i+1;
return i;
}             
当然,以上代码只是说明问题,不能运行,只是说明++i是左值表达式
 
  
 i++的实现:
int ++(int i)
  {
        int temp=i;
          i=i+1;
         return temp;}
 
   
  
返回临时对象,然后临时对象不存在了,所以,不能再被赋值,因此
是右值表达式

你可能感兴趣的:(C语言)