posts - 256, comments - 1319, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

r-value(Rvalue) 和l-value(Lvalue)

Posted on 2004-08-02 11:44 FantasySoft 阅读(2346) 评论(7)  编辑 收藏 所属分类: All About SoftPure C++

        在写引用类型与指针的比较这篇随笔的时候,我写了一些试验性的代码以检验一些结论是否正确。
        首先,引用是一个const的指针(注意不是指向const object的指针),所以在声明一个引用的同时必须
对这个引用进行初始化。因此

int &b;

编译不能通过是自然而然的事情,错误信息是:references must be initialized。多事的我就想,既然是const的指针,那我能不能这么写呢:

int * const b; 

结果错误信息变成了const object must be initialized if not extern。接着我再给这个statement加了个extern。OK,编译错误没有再出现了,接着,我给这个指针进行赋值。结果出现了这样的编译错误:
        l-value specifies const object

        到此为止,我看到了一个似懂非懂的东西l-value。 到底什么是l-value呢?我第一时间想到左结合了,譬如说"hello" + "world" + "!" 等价于("hello" + "world") + "!"。由此推广,我可以想到的左值的一个解释就是:在赋值的时候,"="运算符左边的就是左值了。
        而事实上,我的猜测也是基本正确的。左值必须引用于某个对象,而对于赋值运算符,它的左操作数必须是一个左值(lvalue expression must refer to an object.For the assignment to be valid, the left operand must refer to an object-it must be an lvalue. [1] );而右值(rvalue)则是具体的数字型或是字符型的值(Every expression is either an lvalue or an rvalue." So an rvalue is any expression that is not an lvalue. [1])。
      
        以下是对于左值和右值在使用上的几个要点:
        1、右值是不能转化为左值的,而反过来,则是可以的。如:    

int a, b;
= b;

              a和b都是左值,但是b出现在了赋值运算符的右边。编译器在编译过程中做了左值到右值的转换。    
        2、"+"运算符的操作数没有左值或是右值的限制,但是运算的结果却是右值。比如说:

(m + 1= n;

              是会发生编译错误的,因为m + 1是右值;
        3、"&"运算符的操作数必须是左值,而结果也是右值(注意这是取址运算符哦,别跟引用搞混了);
        4、"*"运算符的操作数则左值或着右值,其结果则是左值,如

int a = 2;
int *= new int[3];
*= a;
*(p+1= 3;

       [1] Lvalues and Rvalues

Feedback

#1楼    回复  引用  查看    

2005-08-02 17:19 by cpunion      
4、"*"运算符的操作数则左值或着右值,其结果则是左值

int n = 5;
int m;
int* p = &n;
int* q = &m;
*q = *p;
*的结果可以为右值,其实你第1条已经说了,“右值不能做左值,反过来是可以的”。

我认为“"*"运算符的操作数是左值或着右值”这句话本身是有问题的,这个操作符的操作数应该总是按右值来对待,因为它总是取这个操作数的“值”。

#2楼 [楼主]   回复  引用  查看    

2005-08-02 18:03 by FantasySoft      
To cpunion: 您说的很有道理。但这样的说法是基于p是左值,而p+1返回的是右值的情况下的。

正好是一年前的post,有点FT......

#3楼    回复  引用  查看    

2005-08-04 10:59 by cpunion      
前面没说清,仔细想了一下,应该这么说:
*作为解引用操作符,它要求一个指针作为它的右值,这个操作符的结果是一个左值,而左值当然也可以作为右值。
 
我还没注意到是去年的呢,看日期还以为是刚发上来的。是从主页上看到的另一篇文章,然后转到这里来了,果然是有点FT。。

#4楼 [楼主]   回复  引用  查看    

2005-08-04 14:36 by FantasySoft      
To cpuion:您指的主页是哪里?

#5楼    回复  引用  查看    

2005-08-04 17:41 by cpunion      
是www.cnblogs.com上看到你的另一篇文章《也说Type Inference》,发布以后都可以在那里看到的。然后看到这篇,一看日期也是8月2日,没想到差了一年。。

#6楼    回复  引用  查看    

2005-08-04 17:45 by cpunion      
哦,看来是我没说清。

我的意思是在cnblogs主页上看到你的另一篇文章,看完以后我就转到这个页面上来看了。。最近放松了学习,连话也说不清了,不好意思。。

#7楼 [楼主]   回复  引用  查看    

2005-08-04 17:56 by FantasySoft      
To cpuion: 别那么客气啦。我比较感兴趣的是你怎么从《也说Type Inference》那篇Post转到这篇Post上来的。 如果是我要找回这篇Post,需要大费周章的点击左边的“随笔档案”里面的2004年8月,然后从显示出来的Post列表的最下面才能看到这篇Post。

最近精神比较紧张,对一些东西有点敏感,呵呵~~~

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-14 17:25 编辑过
 
另存  打印