返回   cpper编程论坛 > 技术杂烩
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

技术杂烩 找不到地方的技术问题?这里!

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2004-01-14
普通会员
 
注册日期: 2002-09-10
帖子: 33
021850524 正向着好的方向发展
默认 请问什么是左值?

总看到有左值这个词,网上查了查也没看明白.麻烦大侠再讲一讲.多谢.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2004-01-14
高级会员
 
注册日期: 2002-09-15
帖子: 2,531
ajoo 正向着好的方向发展
默认

难啊。C里面左值的意义还比较明确,就是可以放在等号左边的东西。
c++里就糊涂了。

跟const,临时变量等概念都扯得上联系。

等着pora的标准答案吧。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2004-01-15
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,135
文章: 20
polyrandom 正向着好的方向发展
默认

1.C++里面对于左值的概念的确复杂了。整个C++唯一一句简单的说左值的话是:一个表达式不是左值就是右值。
2.你大致还是可以按照C语言里面的概念来理解,一般不会有人没事把operator=定义成const的。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2004-01-15
高级会员
 
注册日期: 2002-09-15
帖子: 2,531
ajoo 正向着好的方向发展
默认

我来给出一些相关的细节吧,虽然我不能把这一切组成一个可以自圆其说的简单规则。

表达式分很多种啊

1。 "abc", 1.1之类的literal是右值。
2。所有命名变量,不管是const还是非const,都是左值。这条有点别扭的地方是对于常量定义:const int i = 5; 这个i也成了左值,而#define i 1里面的i却是右值。

3。函数返回引用的,对函数的调用结果为左值。否则为右值。从这条来说,*p可以写成p.operator*(), 返回引用,所以是左值。同理a[i]也是左值啦。

左值和右值的区别:
因为左值也可能为const,右值也可能不是const,所以C里面的等号左边的区分好像不大好用。
可能可以如此区分:左值可以用内建的&符号取地址(虽然对常量定义取地址可能结果不定);右值不能用&取地址(虽然任何一个成员函数内部都可以得到this指针也可以返回它)


就这些支离破碎,到处充满了例外的条条,就是我的左值/右值的理解了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2004-01-15
高级会员
 
注册日期: 2003-11-19
帖子: 265
我要自由 正向着好的方向发展
默认

可不可这样定义:
左值就是一个对象(或一块内存)的引用表代式。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2004-01-16
primer 的头像
普通会员
 
注册日期: 2003-10-26
帖子: 57
primer 正向着好的方向发展
发送 MSN 消息给 primer
默认

*P
p应该是左值.*P是右值.

还有**P.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2004-02-07
普通会员
 
注册日期: 2002-09-10
帖子: 33
021850524 正向着好的方向发展
默认

我看钱能的那本书上说,左值是指一块内存空间,且这块空间可被程序改写.那按照他说的,
代码:
const int i=5;
中的i就不是左值了.而
代码:
int i;
中的i应该就是左值了.
同理,
代码:
const int *p;
中的p是左值,*p就不是左值了.
我理解的对吗?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #8 (permalink)  
旧 2004-02-07
BoC BoC 当前离线
高级会员
 
注册日期: 2002-10-20
帖子: 148
BoC 正向着好的方向发展
默认

任何可被改变的对象均可作为左值,左值就是被赋值的一边,而右值就是将自己的值赋给别人那位。左、右值并不特指某一个或某一类对象,有的对象可以作为左值,也可以作为右值,有的只能作为右值,还有的不建议作为左值。总结来说,一个对象可以是左(右)值,但你不能说它就是左(右)值,因为,脱离了赋值关系,就不用谈左值右值。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #9 (permalink)  
旧 2004-02-07
高级会员
 
注册日期: 2003-11-11
帖子: 147
ilovecpp 正向着好的方向发展
默认

引用:
作者: ajoo
左值可以用内建的&符号取地址(虽然对常量定义取地址可能结果不定)
什么情况下结果不定?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #10 (permalink)  
旧 2008-08-16
学习者
 
注册日期: 2008-08-11
帖子: 11
afey 正向着好的方向发展
默认 回复: 请问什么是左值?

我来说一下我自己的理解:
左值其实表示的是地址,右值表示的是地址中的内容。
而左值呢,有分为可修改左值和不可修改左值;对于赋值符必须要求可修改的左值作为其左侧操作数。所以有:
数组名虽然是左值,但是是不可修改的左值,不能对它进行赋值。

对于一个表达式来说,一定是左值或右值,或者既可以为左值也可以为右值。看它到底是左值还是右值,就要看它所在的上下文了。如:
int x = 0, y = 7, z = 3;
x = y;//这里x作为左值出现
z = x;//这里x作为右值出现

不过在c++中左值右值的概念好像复杂的多呢
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #11 (permalink)  
旧 2008-08-18
wqqafnd 的头像
高级会员
 
注册日期: 2004-10-08
帖子: 193
文章: 1
wqqafnd 正向着好的方向发展
发送 MSN 消息给 wqqafnd
默认 回复: 请问什么是左值?

左值,右值的概念是以人的经验习惯为基础的。
根据习惯,等号左边的的值,是被改变的值,是非const的;等号右边的值,是不被改变的,可以是const或非const。
但是在C++里这一切都不是绝对的,比如下面的代码:
C++ 代码:
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct A
  6. {
  7.     int x;
  8.     A(int k = 0):x(k){}
  9.     const A & operator =(A & x) const{
  10.         cout<<"operator =()\n";
  11.         ++x.x;
  12.         return *this;
  13.     }
  14. };
  15.  
  16. int main()
  17. {
  18.     const A c1(1),c2(2);
  19.     A m1(3),m2(4);
  20.     c1 = m2;            //operator =()
  21.     cout<<c1.x<<endl    //1
  22.         <<c2.x<<endl    //2
  23.         <<m1.x<<endl    //3
  24.         <<m2.x<<endl;   //5
  25. }
左值是const A,右值却需要是非const的,一切都看编码者怎么设计。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 08:24 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0