2019独角兽企业重金招聘Python工程师标准>>>

C对于右值的定义是表达式的值,C中所有完整表达式的结果都是右值。所谓完整表达式(full expression),指的是这样的表达式,它不是其它表达式或声明符的一部分。包括条件表达式和逗号表达式等等都不产生左值,而子表达式计算产生的中间结果或临时对象,很多人以为都是右值,但实际上,它们不一定是右值。例如:

int a[ 5 ] = { 1, 2, 3, 4, 5 };

int *p = a;

*p = 2;                         /* A */

a[ 1 ] = 3;                     /* B */

*p;                             /* C */

a[ 1 ];                         /* D */

A和B中的*p和a[ 1 ]都是内置赋值运算符的子表达式,虽然都是中间结果,但显然都属于左值表达式;只有当它们作为完整表达式时,如C和D中的*p和a[ 1 ]所示,都会进行最后的左值转换,使得结果皆为右值。这个现象的本质,是由于C将所有完整表达式的结果一律进行最后的从左值到右值的转换,这个行为可以理解为一个完全求值的过程(完全求值不是标准术语)。

但C++的完整表达式并不要求进行完全求值,是否保留左值性视需要而定,这个“需要”是什么?其实是C++某些运算符的强制规定,例如内置赋值运算符、前置增量和前置减量运算符等等,这类运算符的结果被强制规定为左值,对于条件运算符,只有第二和第三表达式皆为左值且类型相同时才保证结果为左值。原因无它,仅仅规定而已。

右值是不是对象?由于左值要求一个对象,因此比较容易产生的误解是,右值不是对象。但,如果函数返回一个结构呢?

struct S { int a; };

struct S fun( void ){ struct S s; ...; return s }

由于POD结构属于聚集,不是标量,因而POD结构不是一个值,标量才被视为一个值。上述代码中,fun返回了一个POD结构S的临时对象,而且是一个右值,即无论C还是C++都存在右值对象,。因此,右值只是不要求是对象,并非不能是对象。

转载于:https://my.oschina.net/monkeybiao/blog/56349

C/C++左值性精髓(二)哪些表达式是左值,哪些是右值?----右值表达式相关推荐

  1. 甘肃电大计算机考试题2007,甘肃电大2021年春季《C++语言程序设计(专)》形成性考核二满分...

    2021年春季<C++语言程序设计(专)>形成性考核二 2 N; I% A& N! M3 G1.[填空题] 一个二维字符数组a[10][20]能够存储的每个字符串的长度至多为 .4 ...

  2. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  3. 左值、左值表达式、左值引用 C++

    左值和右值 1.左值:左值是一个对象或变量,可以代表着一个固定地址. int i = 3://此时,i是个变量,本质和对象一样,是一块内存区域,代表着一个固定的地址. 右值:不能作为左值的都是右值,要 ...

  4. php某列为键数组为值,PHP 将二维数组中某列值作为数组的键名 -- 超实用

    有时候,想通过数组的中某字段值, 然后再在二维数组中获取存在该字段值的数组: 一般能想到的就是foreach 遍历比较一下跟该字段值一样,就获取到想要的数组,如下: //测试二维数组 $arr =ar ...

  5. PHP根据键值,对二维数组重新进行分组

    今天有一个需求,需要对查出来的数据按订单进行分组,原本是想使用sql的group by进行分组查询的,但发现group by 查出来数据,每组只有一条数据,不符合需求. 于是百度找到一个php根据键值 ...

  6. java中的左值右值_快速了解C/C++的左值和右值

    最近在segmentfault上看到一个提问<c++隐式的类类型转换问题>:一时不知怎么回答,查阅相关资料后整理了本文,以供参考学习. 定义 早期的C给出的定义:左值是一个表达式,可能出现 ...

  7. 索引左前缀性的三层意思

    在很多数据库中,当创建多列的索引的时候,会出现最左前缀的现象. 假设有如下表: create table AAA (a varchar2(32) ,b varchar2(32),c date); 在a ...

  8. 【Python实用基础整合(二)】DataFrame是否为空判断及行/列差值、变化率计算

    一.DataFrame是否为空 判断整个DataFrame是否为空的方法: pandas.DataFrame.empty 示例: df = pd.DataFrame({'fruits':['apple ...

  9. 赋值表达式的左值和右值

    名称 含义 左值 一般出现在赋值表达式的左边,但也可以出现在赋值表达式的右边.其特点是有变量名即可通过地址访问并修改的内存块 右值 只能出现在赋值表达式的右边,特点是没有名字,即没有可访问的地址名,只 ...

最新文章

  1. 6.字符串解析(LeetCode第394题)
  2. 7、恢复数据库(mysql命令)
  3. hdu 5230(整数划分,dp)
  4. 批处理之列出目录下所有文件
  5. MSF(五):客户端渗透
  6. 如何访问 SAP Screen Personas 培训系统以及完成一个最简单的例子
  7. python坦克大战_Life is short,you need Python——Python实现坦克大战(一)
  8. 【Elasticsearch】 es ElasticSearch集群故障案例分析: 警惕通配符查询 Wildcard
  9. ubuntu两张网卡时的网络设置
  10. linux系统Vsftpd搭建FTP
  11. C#中判断字符是否为中文
  12. Arduino ESP8266 AP Web 服务器示例程序
  13. 怎么从PDF中提取图片?教你简单的提取方法
  14. SQLServer数据库文件压缩
  15. 简述公网IP、私网IP、动态IP、静态IP
  16. linux编译一直失败,linux编译安装时常见错误解决办法
  17. b85主板装服务器系统,[U盘装系统]技嘉B85主板U盘装系统图文教程
  18. apt-get 安装失败:Unable to correct problems, you have held broken packages
  19. 解决gitlab内置node_exporter提供外部prometheus使用
  20. android远程控制灯光,11款可用手机远程控制的智能灯

热门文章

  1. 深度学习入门指北——从硬件到软件
  2. 干货丨盘点人工智能从业者必备的10个深度学习方法
  3. 干货丨一文看懂什么是“自然语言处理”
  4. (完全解决)Key already registered with the same priority: GroupSpatialSoftmax
  5. 认清智能化战争的制胜根本
  6. 量子计算技术的研究现状与趋势
  7. 张亚勤2020寄语哥伦比亚大学毕业生:引领未知时代
  8. 混合云关键技术能力和发展趋势
  9. 【学术笔记】探索大脑静息态活动中的动态信息
  10. Drive.ai轰然倒下:曾估值两亿,吴恩达夫妇站台,苹果将接盘部分可用技术人才...