Chapter4:表达式
- 左值和右值
当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
一个重要的原则是需要右值的地方可以用左值来代替,但是不能把右值当作左值使用。(13.6有例外情况)
下面是集中用到左值的情况:
1.赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果依然是一个左值;
2.取地址符作用于一个左值运算对象,返回一个指针,此指针是一个右值;
3.内置解引用运算符、下标运算符、迭代器解引用运算符的求值结果是左值;
4.内置类型和迭代器的递增递减运算符作用于左值运算对象,其前置版本所得的结果是左值;
ps.decltype作用于求值结果是左值的表达式得到的是一个引用类型。
- 除法与求余:算术运算符的运算对象和求值结果都是右值
C++11新标准规定商一律向0取整(即直接切除小数部分)。
m%n的结果是m-(m/n)*n
逻辑和关系运算符的返回值是bool类型。其中,逻辑与和逻辑或都是短路求值。
赋值运算符的结果是它的左侧运算对象,并且是一个左值。结果的类型是左侧运算对象的类型。
赋值运算满足右结合律。
- 递增和递减运算符
有两种形式:前置版本和后置版本。前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。
建议:除非必须,否则不用递增递减运算符的后置版本。
//经验
//后置递增运算符优先级高于解引用运算符
cout << *iter++<<endl;
- sizeof运算符满足右结合律
对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有元素各执行一次sizeof并将所得结果求和。
对string对象或vector对象执行sizeof运算,只返回该类型固定部分的大小;
逗号运算符的结果是右侧表达式的值。如果右侧运算对象是左值,那么最终的求值结果也是左值。
- 类型转换:
1.整数提升:把小整数类型提升为大整数类型;
2.无符号类型:无符号类型 op 带符号类型:如果(unsigned≥signed),那么带符号对象转换成无符号对象;如果(unsigned<signed),转换的结果依赖于机器,如果unsigned的所有值可以放到signed类型中,那无符号对象转换成有符号对象;否则,带符号对象转换成无符号对象;
3.数组转换成指针:在大多数用到数组的表达式中,数组自动传换成指针;
- 显示转换:
static_cast:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。
const_cast:只能改变运算对象的底层const。
Chapter4:表达式的更多相关文章
- Chapter4(表达式) --C++Prime笔记
1.重载运算符:为已经存在的运算符赋予另外一层含义. 2.左值与右值: ①当一个对象被用作右值的时候,用的是对象的值(内容):当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置). ②在 ...
- JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题
Chapter4 变量.作用域和内存问题 l 理解基本类型和引用类型的值 l 理解执行环境 l 理解垃圾收集 4.1基本类型和引用类型的值 l ECMAScript变量包含两种不同数据类型的值 ...
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
随机推荐
- esriControlsMousePointer 控制鼠标指针
axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass; 控制鼠标指针选项. 不变 值 描述 esriPo ...
- phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计
phpcms V9首页 频道页 列表页 推荐位 简单获取文章浏览量和评论统计 列表取得数据方法: {pc:content action="lists" catid="$c ...
- windows系统下Python环境的搭建
1.下载最新的Python版本3.5.0.
- 基于Struts2框架实现登录案例
一,准备工作 1)新建web项目,并导入Struts2jar文件和配置web.xml文件. struts2 jar文件 web.xml文件 <?xml version="1.0&qu ...
- Python第一天——初识Python
python是由荷兰人Guido van Rossum 于1989年发明的一种面向对象的的解释型计算机程序设语言,也可以称之为编程语言.例如java.php.c语言等都是编程语言. 那么为什么会有编程 ...
- Django admin的一些有用定制
Model实例,myapp/models.py: from django.db import models class Blog(models.Model): name = models.CharFi ...
- Struts知识问答 分类: 面试 2015-07-10 22:01 4人阅读 评论(0) 收藏
1. 简述Struts框架的初始化流程. 答案: 对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet ActionServlet从struts-c ...
- [HDOJ3974]Assign the task(建树胡搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3974 出现在窝bin的线段树专题里…第一时间想的是记录入度找出根节点,然后标记深度转换到线段树中.但是 ...
- C++ STL之set的基本操作
set是集合,虽然也存在键值和实值,不过两者根本就是同一个值,键值的设置完全就是为了满足红黑树的底层结构,set操作与map很像不过也有些不同. 1. set迭代器与map的不同: (1)set使用接 ...
- 购买使用Linode VPS必须知晓的十个问题
Linode是国外非常著名的VPS商之一,目前在国内站长圈中备受推崇.有许多站长已经购买了Linode VPS,但是部分站长由于中英语言不通,对Linode的政策不了解,从而造成了许多不必要的损失.本 ...