C/C++-左值、右值及引用】的更多相关文章

左值与右值 什么是左值?什么是右值? 在C++里没有明确定义.看了几个版本,有名字的是左值,没名字的是右值.能被&取地址的是左值,不能被&取地址的是右值.而且左值与右值可以发生转换. 我个人的理解就是在当前作用域下右值是个临时变量. 举例如下:https://blog.csdn.net/wangshubo1989/article/details/50479162 // lvalues: // ; i = ; // ok, i is an lvalue int* p = &i; //…
C++98中规定了左值和右值的概念,但是一般程序员不需要理解的过于深入,因为对于C++98,左值和右值的划分一般用处不大,但是到了C++11,它的重要性开始显现出来. C++98标准明确规定: 左值是可以取得内存地址的变量. 非左值即为右值. 从这里可以看出,可以执行&取地址的就是左值,其他的就是右值. 这里需要明确一点,能否被赋值不是区分C++左值和右值的区别. 我们给出四个表达式: string one("one"); const string two("two&…
最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 )   参考:<Boost程序库探秘——深度解析C++准标准库(第2版)> 9787302342731   左值:一个可以用来存储数据的变量,有实际的内存地址(变量名): 右值(非左值):“匿名”的“临时”变量,在表达式结束时生命周期终止,不能存放数据,可被修改,也可不被修改(const修饰).   鉴别左值右值: 左值可用取地址操作符&获取地…
一.引子 我们所谓的左值.右值,正确的说法应该是左值表达式.右值表达式. 因为C++的表达式不是左值就是右值. 在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在等号右边的表达式. 而在C++中,二者的区别就不是这么简单了. 二.关键点 [官方定义] 一个左值表达式的求值结果是一个对象或者一个函数,而某些右值表达式的求值结果也是对象: 以常量对象为代表的某些左值并不能作为赋值语句的左侧运算对象. 归纳:当一个对象被用作右值的时候,用的是对象的值(内容):而被…
1. 数据对象 赋值表达式语句的目的是把值存储到内存位置上. 用于存储值的数据存储区域统称为数据对象. 2. 左值 左值是C语言的术语, 用于标识特定数据对象的名称或表达式. 对象指的是实际的数据存储, 而左值用于标识或定位存储位置的标签. 对于早期的C语言, 提到左值意味这: a. 它指定一个对象, 所以引用内存中地址; b. 它可用在赋值运算符的左侧. 后来, 标准中新增了const限定符, 用const创建的变量不可修改. 因此, const标识符满足a项, 但是不满足b项.  一方面C继…
1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也同理,但是写成++a是没有问题的.上面的理解是很粗浅的,深入理解需要涉及左值右值的概念. template<typename T> T min(T &x, T &y) { return (x < y) ? x : y; } int main() { using namespa…
左值(LValue)和右值(RValue)的一个快捷记法是赋值运算,左值是赋值运算左边的值,右值就是右边(=,=废话).例如: int a = 5; a就是左值,5就是右值. 当然,如果真是这么个含义,那么这概念就相当蛋疼了.其实不是这样的~~ 左值其实是对一块内存区域的引用(这个还不是C++中的int &a之类的引用),比如上边的a,就对应了一块内存区域(起始地址为&a,大小为sizeof(int)). 更专业的定义在这里: An object is a region of storag…
1.移位操作符 移位操作符分为左移操作符(<<)和右移操纵符(>>) 对于无符号数:左右位移操作都是逻辑位移 对于有符号数:到底是采用逻辑位移还是算术位移取决于编译器.如果一个出现使用了有符号数的右移操作,它就是不可移植的. 对于左移操作:右边空出来的位数用0补齐. 对于右移操作:如果是逻辑位移,左边移入的位用0填充;如果是算术位移,左边移入的位由原先该值的符号位决定,符号为为1则移入的位均为1,符号为为0则移入的位均为0. 注意: a << -5; 这种形式的移位由编…
左值引用VS右值引用 左值引用对于一般的C++程序员再熟悉不过,但对于右值引用(C++0X新特性),就稍微有点不知所云 左值VS右值 在定义变量的时候,经常会用到左值和右值,比如:int a = 1;int b = a + 1; 上面这段代码,a先作为左值,在作为右值.在作为右值的时候,是相当于(原理上等同,但不一定对) int tmp(a + 1);int b(tmp); 中间会先建立一个临时遍历,然后在把临时遍历赋值给b.对于数,只能作为左值,而变量名,即可以作为左值又可以作为右值.(作为左…
1:C++的引用,引用和指针的区别? 1:从汇编指令角度上看,引用和指针没有区别,引用也是通过地址指针的方式访问指向的内存 int &b=a ; 是需要将a的内存地址取出并存下来, b=20;(通过引用修改值时,也是先取出指向的地址,然后访问该地址的值并修改它,和通过指针修改值一样) 在定义引用的时候,必须初始化,并能够对a取地址.所以 int &c=20 编译错误的,因为20取不了地址. 2:引用只有一级引用没有多级引用,指针有一级指针和多级指针 3:定义一个引用变量和定义一个指针变量,…