阅读新闻

The New C++ -- 变量 (7 左值右值)

发布日期:2019-07-28 03:13   来源:未知   阅读:

  左值右值也是C++中的一个很常见也很重要的概念,但奇怪的是大部分教科书并不会详细提及。本系列文章中的很多地方都会提到左值右值,请务必仔细理解。

  左值(lvalue),源自于left-value,原本是指赋值号左边的值。右值(rvalue),源自于right-value,原本是指赋值号右边的值。例如,

  在给var这个变量赋值的这个表达式中,var为左值,3为右值。我们提到过的几种基本数据类型的字面值常量全部为右值。例如你不可以

  随着C++的发展,左值和右值的意义已经不仅仅是赋值号左边和右边那么简单了。当然上面的例子还是成立的,只是左值和右值有了更复杂的解释,例如右值在C++中是可以被放在赋值号左边的,虽然这种情况很少见(以后遇到我们会指出总结)。左值在C++中指的是有地址的内存对象。内存对象即为内存中的一段存储空间,有地址即意味着该存储空间确确实实存在于内存之中。因为被定义的变量都为有地址的内存对象,所以变量一旦被定义,即为左值。有两种特例除外,www.303778.com,第一,临时对象是右值,我们待会儿会讲到。第二,无名字的右值引用(关于引用和右值引用我们很快就会讲到)虽然存在于内存之中,但是C++规定其为一个右值。

  右值在现代C++中指的是非内存对象,临时对象,或者无名字的右值引用。基本类型的字面值常量例如3L,3.14,x等都不是内存对象,因为编译器一般并不在内存中为这些字面值常量预留空间,所以他们都为右值。注意的是,字符串字面值常量是一个左值,因为字符串字面值常量是存在于内存空间之中的,实际上字符串字面值常量是一个数组类型(见下节),除字符串字面值常量的其他字面值常量统统为右值。

  其中var1,var2和var3都为左值,但是var1*3的运行结果和var1*3+var2的运行结果是临时对象,都为右值。

  如果我们说var1和var2都为左值,为何var1可以放在赋值号右边呢?这牵扯到C++的隐性类型转换。在C++中,所有的左值都可以隐性转换到右值,被称为左值到右值的转换(lvalue to rvalue conversion)。C++的每一个操作符(operator)都规定了他的操作数(operand)是左值或者右值。例如地址操作符& 要求操作数必须为左值。

  & 要求操作数必须为左值。在上例中,var是左值,所以&var是正确的用法。但因为3是右值,所以&3是错误的用法。有一种流行的区分左值和右值的方法是,凡是能够放在&后面取其地址的,都为左值,凡是不能放在&后面取其地址的,都为右值。但我认为这种说法有点因果颠倒。并不是因为能够放在&后面才是左值,而是因为是左值,所以才能够被放在&后面。

  注意因为字符串字面值常量是左值,意味着他是一个存在于内存空间的一段内存对象,我们可以取其首地址。有兴趣的读者可以自己试验。

  赋值号操作符要求左面为左值,右面为右值(注脚:注意这个规则对用户自定义类型来说有不符合规则的特例)。其他所有操作符例如加法操作符,减法操作符等对操作数的要求都将在操作符一章中详述。

  C++规定,当操作符要求操作数为右值,但是提供的操作时却是左值的时候,就会自动执行左值到右值的转换。所以上例中例如var1=var2是成立的,因为var2被自动转换为右值。左值和右值在这些简单的例子中并无太大用处,因为你并不需要左值和右值的概念来理解赋值号和地址操作符。但他们在其他的一些情况,特别是涉及到左值引用和右值引用的时候会十分有用处,我们稍后再谈。

  小知识:C++的最新标准详细的地解释了左值和右值的概念,也更细化的将所有表达式分为左值(lvalue),失效值(xvalue,源自expiring value)和纯右值(prvalue,源自pure rvalue)。其中左值和失效值合称为泛左值(glvalue,源自generalized lvalue),失效值和纯右值合称为右值(rvalue)。本系列教程并不采用如此的细分,因为这只会造成读者困惑。简单的说,左值和我们说的一样,是一个存在于内存中的对象,除临时对象和无名字的右值引用。失效值仅有一种情况:无名字的右值引用。纯右值包括非内存对象和临时对象。失效值和纯右值合称右值,和我们定义的一样。失效值和左值和称为泛左值。

  左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。...博文来自:Hymans Blog

  这篇blog主要介绍一下左值和右值的概念及应用陷阱1、左值和右值的概念     左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;     右值当在赋值号右边取出值赋给其他变量的值;右...博文来自:絮雨清风

  在C语言当中,我们经常会遇见一些平时感觉怎么用都不会出错的小知识点,但是再将它的难度提高一点点的时候,或者将它改变一点点,我们就不再将它用起来那么的得心应手。左值和右值正是一个这样的十足十的例子。在学...博文来自:白小姐

  函数返回之后,临时变量不能再被访问,只是没有指针指向该内存单元(因为rbp改变了),但是函数返回之前,会将该单元的值赋给寄存器,所以函数返回仍然可以得到了正确的值。c++程序代码:#includein...博文来自:l_jie_jie_的博客

  关于左值和右值的理解:①从位置来讲:eg:a=b;a在左边,a为左值,那在右边的b就是右值(前提是语句合法,比如说a+25=b;则不合法) ②深层次讲:左值(L_value,L理解为Location)...博文来自:Noriaki的博客

  一下引用网友:lm_whales左值可以当作右值使用,右值不能当左值用.左值可以出现在=的任何一方,出现在=右方的左值,是把左值当作右值使用,这是非常正常的.右值,不能当作左值使用.能够(单独)出现在...博文来自:小哥哥咯的博客

  1.左值:左值可以出现在赋值语句的左边或者右边,            例如:变量是左值;2.右值:右值只能出现在赋值的右边不能出现在赋值语句的左边,            例如:数字字面值是右值。3...博文来自:myhappyness的专栏

  左值和右值的区别,以及C++11中对左值符号&和右值符号&&、std::move。博文来自:KangRoger的专栏

  在C++11中所有的值一定属于左值、纯右值和将亡值三种值之一,分别介绍一下这三种类型。左值与右值在C++中定义左值与右值的比较标准的方法是根据其可以取地址来判断。左值就是可以对变量进行取地址或者有名字...博文来自:StephenZou14的博客

  一、单独编译与其将结构声明加入到每一个文件中,不如将其放在头文件中,然后在每一个源代码文件中包含该头文件。也可将函数原型放在头文件中。因此,可以将原来的程序分成三部分:头文件:包含结构声明和使用这些结...博文来自:鱼思故渊的专栏

  c语言中左值、右值定义:例子:a=b+25;左值:能够出现在赋值符号左侧的东西。例子中a,右值:能够出现在赋值符号右侧的东西。例子中b+25上面的例子可以写成这样吗?b+25=a;答案是否定的。原因如...博文来自:普通人遵守规则,牛人无视规则,伟人创造规则.无视规则之前要了解规则!

  C++的左值和右值的概率继承自C语言里。C++11之后引入右值。左值和右值的根本区别就是左值可以使用amp;取地址,而右值是不可以取地址的。还有一点就是,右值是可以赋值给左值,但是反过来就不...博文来自:知行合一 止于行善

  在学习C++primerPlus的第八章“函数探幽”的过程中,我终于见到了以前一直不懂的“intamp;amp;a”字样的语法结构。现在知道了,这个叫做“右值引用”,其特点...博文来自:yibeiyese的博客

  转载如果实参与引用参数不匹配,C++将生成临时变量。如果引用参数是const,则编译器...博文来自:llxuexixiaobing的博客

  1.背景左值右值其实是各种语言普遍存在一种语法,只是在C++11中变得比较突出,原因是C++11中增加了一些与左值右值相关的语法,例如左值引用(amp;)、右值引用(amp;&am...博文来自:weixin_33912453的博客

  一个变量在表达式中是代表左值还是右值,可以直接对该变量取地址,如果可以取地址,则该变量当前代表左值否则代表右值。这点是很重要的,一个变量当前代表左值还是右值是于当前变量的类型无关的。classWidg...博文来自:我喜欢雨天的清新的博客

  inta,b;a=b+23;a=b+23;是正常的赋值表达式,a是左值,b+23是右值。在赋值表达式中,左值是变量,是要将a的值改变为另外的值;右值是常量,是不可改变的量,b在定义的时候就已经有了初始...博文来自:nostalgia_lousilu的博客

  右值和左值左值右值的形式区分(或者称语法区分)是能否用取地址&运算符;语义区分(即其本质涵义)在于表达式代表的是持久对象还是临时对象。当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左...博文来自:wy11933的博客

  *a++的含义1、*和++哪个优先级更高?两个处于同一优先级,编译器结合方向是自右向左,所以*a++可看成*(a++)*P++可看成*(P++),即先执行p++,后执行*p。但由于这里的“++”号是后...博文来自:韩左左的专栏

  左值和右值简言之,左值指的是变量/变量表达式(指向内存位置的表达式eg:1/2a+1/3a),右值指的是数值/数值表达式(存储在内存中某些地址的数值eg:2*3)。左值可以出现在赋值号的左边或者右边,...博文来自:德prince

  C++/C++11中左值、左值引用、右值、右值引用的使用博文来自:网络资源是无限的

  左值是一个古老的术语,它是指表达式只能出现在赋值运算符的左侧,在js中,变量,对象属性和数组元素均是左值...博文来自:weiAX95的博客

  左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久对象,右值指表达式结束时就不再存在的临时对象——显然右值不可以被取地址...博文

  三目运算符在C语言中是右值,右值不可以被赋值。但在C++中,三目运算符是左值,左值可以赋值。在C++中三目运算符返回的是变量本身。#include#includeintmain(){inta=1,b=...博文来自:vinnyjia的博客

  左值和右值左值和右值从字面意思来看,就是等号的左右两边的意思,但其实不是这样的,左值是有名字的,是可以取到地址的,而右值是没有名字的,是不可以取地址的。其实可以简单的理解为凡是可以取到地址的变量都是左...博文来自:m0_38126105的博客

  1.左值和右值C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并...博文来自:暮日落流年的博客

  在C++11中所有的值必属于左值、右值两者之一。C++98左值(lvalue),可以放在赋值运算符=左边的变量或者表达式,有名字,可以取地址。右值(rvalue),临时变量值(非引用返回的函数返回值、...博文来自:程序员Link

  &与&&  对于在C++中,大家对于符号“&”的第一映像是引用和取地址,对符号“&&”的第一映像是逻辑与。但是在C++11中我们会看到下方这种表示方法:int&&k=i+k;  对于第一眼见到上述的表...博文来自:starlight_love的博客

  温故而知新本文涉及两个概念,static_cast和右值引用,在阅读本文之前,最好先阅读下面的文章。C++显式转换(1)-static_castC++11新特性(23)-右值引用C++11新特性(24...博文来自:面向对象思考

  一、自增自减前操作与后操作的区别在c/c++中,自增(++)自减(--)操作符为数据对象加1和减1操作提供了一种方便简洁的实现方式。他们都有前置和后置两种形式。下面给出简单的代码实现:#include...博文来自:yaotengjian的博客

  1、左值和右值左值(left-values),缩写:lvalues右值(right-values),缩写:rvalues直接上官网查,我一向倡导自己去懂得原理,而原理都是老外写的,当然我只是针对c++...博文来自:coco的博客

  c++11中增加了右值引用和move语义来避免一些不必要的构造和copy操作,以此来提升程序的运行效率。首先说左值和右值,他们绝不是简单的等号左边和右边的区别,总结来说: 1.左值可以寻址,而右值不...博文来自:D_Guco的专栏

  我们先来简单介绍下引用:C和C++使用符号来只是变量的地址。C++给符号赋予了另一个含义,将其来声明引用。例如,要将rodents作为rats变量的别名,三第开奖结果论坛,可以这样做:in...博文来自:Jeff_的博客

  ligand:虽然这些特殊符号写在C++的标准里面,但是很多编译器例如Visual C++并不支持——这句话有歧义。我初读是以位在说Visual C++不支持\?的转义,还亲自试验一下发现支持啊。 这段话上下文是指“三字符组与双字符组”(见中文维基),因为C语言必须的位运算符 ~ 等在老式法语键盘被带附加符号的法语字母顶替了,所以C语言标准引入用 两个??开头的“三字符组”来转义这些可能在键盘上缺失的符号。从Microsoft Visual C++ 2010版开始,该编译器默认不再自动替换三字符组。如果需要使用三字符组替换(如为了兼容古老的软件代码),需要设置编译器命令行选项/Zc:trigraphs g++仍默认支持三字符组,但会给出编译警告。

  刘芊含一直到现在也还没有结婚,所以刘芊含的老公目前并不存在,关于刘芊含的男朋友是谁也没有可靠的消息,这么多年刘芊含一直都把精力放在自己的演艺事业上面,在感情方面还没有什么进展,但是这也可能是刘芊含本人低调的原因,相信不久刘芊含也会有自己感情方面的进步。

  规范中要求,学校食堂还应进行以下6项检测:对营养餐进行感官检测;测定蔬菜农药残留、畜肉瘦肉精等;对亚硝酸盐等进行快速检测;对化学消毒剂浓度测试;对食品冷藏设施监控温度;对食品加工出锅及销售温度进行监控。

  小姐姐这款竖条格的裙子,白色和褐色相间,有点病号服的效果,还有点风衣的味道,侧面的开叉设计,非常个性,这样的连衣裙穿搭简单,腰间的腰带也很时尚,搭配一刷那个个性的拖鞋,很休闲的搭配效果,逛街其实可以休闲一些。

  书房的布置非常实,采用定制家具翟力通,安装帆布鞋踩了一个榻榻米,并延伸出笃行致远什么意思一个书柜,书柜直接装到顶有足够的藏书空间,满足藏书需求。

  然而伯明翰在1989年沉沦,记下球会史上首次在丙级联赛作赛的纪录。但这挫折却激起球队的斗志。当时主教练法兰西斯倾尽全力为球队争取升级,但在三次升级附加赛中,却先后不敌瓦特福德、巴德斯利及普雷斯顿而黯然出局。