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).简短的内容,深入的理解, ...
随机推荐
- 【mongoDB运维篇②】备份与恢复(导入与导出)
导入/导出可以操作的是本地的mongodb服务器,也可以是远程的服务器 所以,都有如下通用选项: -h host 主机 --port port 端口 -u username 用户名 -p passwd ...
- OSSEC 安装执行./install.sh详细信息
下载好ossec安装文件后解压得到如下目录 [root@localhost ~]# cd ossec-hids-/ [root@localhost ossec-hids-]# ll total drw ...
- 基于Struts2框架实现登录案例 之 程序国际化
国际化牵涉的知识非常多,这里只能简单的介绍,程序国际化的一般做法是:在jsp页面时, 不是直接输出信息,而是输出一个key值,该key值在不同语言环境下找到对应资源文件下的 对应信息,因此首先要创建满 ...
- 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)
单向一对多的关联关系 具体体现:1的一方有n的一方的集合的引用,n的一方却没有1的一方的引用 举个例子:顾客Customer对订单Order是一个单向一对多的关联关系.Customer一方有对Orde ...
- SPOJ 1108 Card Trick 暴力模拟
解释一下样例,因为我觉得这个题意表述的不是很清楚.以第二组样例为例. 牌序为:3 1 4 5 2 第一轮:把 3 放到末尾:1 4 5 2 3,最顶上的牌是1,把1拿走.剩余 4 5 2 3 第二轮: ...
- [置顶] Android系统五大布局详解Layout
我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前,视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit等 ...
- FileObverse文件观察者的Debug报告
FileObverse文件观察者的Debug报告 2014年9月18日 9:03
- Android相对布局(RelativeLayout)
Android相对布局(RelativeLayout) 备注:这里的视图和元素是等同的概念. RelativeLayout是一个允许子视图相对于其他兄弟视图或是父视图显示的视图组(通过ID指定).每个 ...
- Android开发之定义app在手机的安装位置
定义app在手机的安装位置,可以通过在清单文件中添加属性 android:installLocation="" 该属性有三个值:auto(自动),preferExternal(外部 ...
- gulp edm测试
gulp工具的 gulp-mailgun 插件可以将你的html代码,通过mailgun服务器来发送,用于测试,用这个工具发送邮件最适合不过了. 首先我们需要引入gulp和gulp-mailgun模块 ...