在编译的时候,偶尔会碰到关于左值或者右值的错误。查了一下关于这方面的介绍,记录一下。

C++中左值(lvalue)和右值(rvalue)的概念是从C继承来的。
在C中,左值通常表示赋值符号左边的值,右值通常表示赋值符号右边的值。
左值通常为带有名字的变量,有固定的内存来存储,在程序中能够通过这个名字寻址;右值一般是运算操作或者函数返回的一个临时值,没有办法获取到他的地址

int a = 5;      //1
int b = fun(); //2
int c = (a + b);  //3

比如上面这段代码,第一行中,“=”左边的a为一个左值,程序的其他地方能够通过“a”这个名字寻址,并获取里面的数值,而“=”右边的5为一个临时值,在这句话中将其值赋给了a这个变量,之后便被销毁,没有办法在其他地方直接调用5这个值,这样的值为右值。
同样,第二行中的fun()返回的值也为一个临时值,也是一个右值。
有时左值能转化为右值,比如在第三行中,a原来为一个左值,但是要将a+b的值幅值给c,所以在这里a和b从左值转换成右值,并通过“+”生成一个右值。
注意:右值不能作为左值使用

5 = a;
fun() = b;
(c + 1) = 4;

上面这些代码都是错误的,原因是将右值作为左值使用,5,fun(),和(c + 1)这些结果都是一个临时的,没有确定的内存空间。

在C++中,每一个表达式都会产生一个左值或者右值。
对于基本数据类型来说,左右值的概念和C中没有太大区别。
对于自定义类型,右值允许通过它的非const成员函数进行修改

class Test
{
public:Test(const int& value) :mValue(value) { cout << "create " << value << endl; };~Test() { cout << "delete " << mValue << endl; }public:void SetValue(const int& value) { mValue = value; }Test& operator+(const Test& v){mValue += v.mValue;return *this;}protected:int mValue;
};int main()
{cout << "----------------1----------------" << endl;Test{ 5 };cout << "----------------2----------------" << endl;Test{ 3 }.SetValue(4);cout << "----------------3----------------" << endl;Test{ 2 } + Test{ 4 } = Test{ 3 };cout << "----------------4----------------" << endl;
}
----------------1----------------
construct 5
deconstruct 5
----------------2----------------
construct 3
deconstruct 4
----------------3----------------
construct 3
construct 4
construct 2
deconstruct 3
deconstruct 4
deconstruct 3
----------------4----------------

从上面结果中可以看出,main中三行都属于一个临时的右值,在结束该行语句后被析构,但是这个右值能够通过自己的成员函数改变自身的值(对比析构和构造函数中打印结果)。

还有一种情况,就是当函数的返回值是引用类型的时候,可以将函数的返回值作为左值。

char& get_val(string& str, string::size_type ix)
{return str[ix];
}
int main()
{string s("a value");cout << s << endl;get_val(s, 0) = 'A'; //get_val函数调用作为左值cout << s << endl;return 0;
}

结果如下:

a value
A value

可以看出get_val(s, 0)返回的是s的引用,然后通过幅值符号将引用所对应的字符修改成’A’。

总结:看完定义和示例后,感觉左值和右值的问题在平时写程序的时候很少被注意,其实按照正常的语法写,也一般不会遇到这种问题,如果遇到了可以针对性的查一下解决方法。

对于左值和右值的理解相关推荐

  1. 理解C和C++中的左值和右值

    翻译至https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/ C/C++编程中不是 ...

  2. 理解C++中的左值和右值

    一.前言 一直以来,我都对C++中左值(lvalue)和右值(lvalue)的概念模糊不清.我认为是时候好好理解他们了,因为这些概念随着C++语言的进化变得越来越重要. 二.左值和右值--一个友好的定 ...

  3. c/c++ 中的左值和右值 理解

    简单的定义 1.左值表示了一个占据内存某个可识别的位置(也就是一个地址)的对象 2.右值则使用排除法来定义. 一个表达式不是左值就是右值.那么,右值是一个不表示内存中某个可识别位置的对象的表达式. 举 ...

  4. C++:深入理解C++11新特性:Chapter3:左值和右值

    Chapter3:左值和右值 1. 将右值绑定到 左值 2. 将右值绑定到 常量左值引用 3. 将右值绑定到右值引用 总结: 5. 左值,右值和右值引用 6. 引用类型可以引用的的值类型 7. 全能类 ...

  5. 理解移动语义(一)左值和右值

    目录 什么是左值 什么是右值 纯右值 将亡值 什么是左值 简单的说,有地址的变量就是左值.比如: int x; ++x; x=1; x > 0 ? x: y;//见我前面的博客<三元运算符 ...

  6. C/C++左值性精髓(二)哪些表达式是左值,哪些是右值?----右值表达式

    2019独角兽企业重金招聘Python工程师标准>>> C对于右值的定义是表达式的值,C中所有完整表达式的结果都是右值.所谓完整表达式(full expression),指的是这样的 ...

  7. 【 C 】对左值与右值的一些个人思考

    今天重温C语言的指针,看的书是<C和指针>,关于左值和右值以及指针表达式的内容看得甚是迷惑与煎熬,怎么会这么难理解,指针表达式又是作为左值又一会作为右值,而且二者有着不一样的含义,为什么当 ...

  8. c++中的左值与右值

    转载自 http://www.cnblogs.com/catch/p/3500678.html 左值 (lvalue)和右值 (rvalue) 是 c/c++ 中一个比较晦涩基础的概念,有的人可能甚至 ...

  9. c语言 变量的左值和右值,C++雾中风景10:聊聊左值,纯右值与将亡值

    C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度.为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一 ...

最新文章

  1. 「SAP技术」SAP MM 采购信息记录新价格不能体现在采购订单新的ITEM上?
  2. springboot的jsp应该放在哪_web项目jsp放在哪里 Spring Boot 静态资源处理(4)
  3. sklearn 笔记:make_blobs 生成聚类数据
  4. Mantis使用说明
  5. Netstat命令(windows下)
  6. boost::math模块计算因子和二项式系数的测试程序
  7. python创建数字列表_Python创建数字列表
  8. 去苹果浏览器默认样式
  9. Nginx+Tomcat搭建集群环境
  10. 读Zepto源码之代码结构
  11. Linux下redis的安装及部署
  12. send/receive h264/aac file/data by rtp/rtsp over udp/tcp
  13. 网工浓缩笔记以及考点(第四章 无线通信网)
  14. 关注流浪猫:从我们出发
  15. 九度OJ—题目1015:还是A+B
  16. 基于微信小程序的‘香草屋’饮料奶茶点单小程序
  17. vue css style 调整字体大小 font-size
  18. 大话西游2服务器维护公告,大话西游2经典版:2019年05月09日停机维护公告
  19. web自动化测试-绕过验证码登录
  20. ANSYS最快最完美工作站与集群配置方案2019

热门文章

  1. MongoDB 实验——数据备份和恢复和数据库优化
  2. 软考复习专题四---多媒体专题
  3. quic java_QUIC 协议网络库
  4. VMware与USB3.0不解情缘(此文献给win7系统只有usb3.0口死活与虚拟机连不上的朋友们)
  5. Excel函数大全-13文本函数
  6. 新氧再次获得2亿元融资,我们找到了它受资本青睐的5个理由
  7. 对“消费分享社区”的感受小结 + 又聊消费分享社区 by 白鸦
  8. C语言常用函数-chmod()改变文件访问方式函数
  9. 地心直角坐标系转经纬高
  10. Shell获取某个文件夹下的所有文件名(含文件夹)