博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左值&右值
阅读量:5981 次
发布时间:2019-06-20

本文共 1114 字,大约阅读时间需要 3 分钟。

一、引子

我们所谓的左值、右值,正确的说法应该是左值表达式、右值表达式。

因为C++的表达式不是左值就是右值。

在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在等号右边的表达式。

而在C++中,二者的区别就不是这么简单了。

 

二、关键点

【官方定义】

  1. 一个左值表达式的求值结果是一个对象或者一个函数,而某些右值表达式的求值结果也是对象;
  2. 以常量对象为代表的某些左值并不能作为赋值语句的左侧运算对象。
  • 归纳:当一个对象被用作右值的时候,用的是对象的值(内容);而被用作左值的时候,用的是对象的身份(在内存中的位置)。

【解读定义】

  解读第一句:既然左值和右值都可以是对象,那怎么区分一个对象是左值还是右值呢?

  • 左值:能用“取地址&”运算符获得对象的内存地址
  • 右值:不能用“取地址&”运算符获得对象的内存地址
  • 特例:因为可以用&取得字符串字面值常量的地址,所以它是一个左值;而其他的字面值常量则不可用&取地址,所以它们是右值

我们知道对象是一块空间,那么有哪些对象以及为什么不能用&取地址呢?

  • 对于临时对象,它可以存储于寄存器中,所以没办法用“取地址&”运算符;
  • 对于(非字符串常量,它可能被编码到机器指令的“立即数”中,所以没办法用“取地址&”运算符。

 

  解读第二句:字符串字面值常量确实不能放在等号左边啊,没错啊!

  解读归纳:所以啊,左值看地址,右值看内容。

【补充】

#include 
using namespace std;int& func(int &a){ return a; // 不能返回局部对象的引用 }int main(){ int a = 10; func(a) = 100; // 返回非常量引用的函数可以当作左值使用 cout << a << endl; // 输出100 return 0;}

 

三、为什么要区分左值右值

  • 不同的运算符对运算对象的要求各不相同,有的需要左值运算对象、有的需要右值运算对象;返回值也有差异,有的得到左值结果、有的得到右值结果。

  举例:使用关键字decltype的时候,其表达式的求值结果若是左值,decltype作用于该表达式(不能是变量)得到一个引用类型。例如,p的类型是int *,因为解引用运算符生成左值,所以decltype(*p)的结果是int &。而另一方面,因为取地址运算符生成右值,所以decltype(&p)的结果是int **,即结果是一个指向整型指针的指针。

 

转载于:https://www.cnblogs.com/xzxl/p/7652612.html

你可能感兴趣的文章
Python实用环境pyenv搭建教程
查看>>
C语言标准I/O文件操作
查看>>
redis学习笔记之虚拟内存
查看>>
WEB前端常用的测试工具
查看>>
HDU 1869 六度分离 最短路
查看>>
k8s部署
查看>>
水仙花数
查看>>
dom与jquery互相转换
查看>>
一个程序员的自白(自负盈亏)
查看>>
前端性能优化分析
查看>>
Linux 文件搜索命令:find、which、whereis 和 locate
查看>>
Jackson 框架,轻易转换JSON
查看>>
air 4.0+,Ane打包注意事项【适用Android】
查看>>
驱动架构的一些开源项目
查看>>
解决jquery中$命名冲突的几种方法
查看>>
KPI绩效考核为何在国内不管用?
查看>>
你所不知的VIM强大功能
查看>>
react+redux状态管理实现排序 合并多个reducer文件
查看>>
Django 配置MySQL数据库 mysql
查看>>
27.读文件时通过两种方式判断文件结尾
查看>>