• 左值和右值

当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

一个重要的原则是需要右值的地方可以用左值来代替,但是不能把右值当作左值使用。(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:表达式的更多相关文章

  1. Chapter4(表达式) --C++Prime笔记

    1.重载运算符:为已经存在的运算符赋予另外一层含义. 2.左值与右值:   ①当一个对象被用作右值的时候,用的是对象的值(内容):当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置). ②在 ...

  2. JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题

    Chapter4 变量.作用域和内存问题 l  理解基本类型和引用类型的值 l  理解执行环境 l  理解垃圾收集 4.1基本类型和引用类型的值 l  ECMAScript变量包含两种不同数据类型的值 ...

  3. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  4. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  5. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  6. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  7. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  8. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  9. SQL Server-表表达式基础回顾(二十四)

    前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...

随机推荐

  1. mysql建表时拆分出常用字段和不常用字段

    一对一 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然. 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名.性别.年龄.身高,体重属于常用数据,但是籍贯.住 ...

  2. 2014-9-17二班----10 web project

    package cn.rwkj.servlet; import java.io.IOException; import javax.servlet.ServletException; import j ...

  3. MVVM 代码记录

      一.XML <Page x:Class="MVVM.MainPage" xmlns="http://schemas.microsoft.com/winfx/20 ...

  4. 本人arcgis api for javascript中常见错误总结

    1. 2.对象不支持"replace"属性或方法 解决办法:一般在ie中执行js会报这样的错误,基本问题就是你引用了某个对象中不存在的方法,可能是这个方法本来存在而你写错了,或者调 ...

  5. MSSQLServer基础06(变量,case,选择语句)

    变量 声明:declare @UserName nvarchar(50) 赋值1:set @UserName=N'杨':修改 赋值2:select @UserName=N'牛':修改 输出:print ...

  6. Java 基础之认识 Annotation

    Java 基础之认识 Annotation 从 JDK 1.5 版本开始,Java 语言提供了通用的 Annotation 功能,允许开发者定义和使用自己的 Annotation 类型.Annotat ...

  7. 12 Useful “df” Commands to Check Disk Space in Linux

    On the internet you will find plenty of tools for checking disk space utilization in Linux. However, ...

  8. LA 4728 (旋转卡壳) Squares

    题意: 求平面上的最远点对距离的平方. 分析: 对于这个数据量枚举肯定是要超时的. 首先这两个点一定是在凸包上的,所以可以枚举凸包上的点,因为凸包上的点要比原来的点会少很多,可最坏情况下的时间复杂度也 ...

  9. PhoneGap 安装体验

    npm -v #显示版本,检查npm 是否正确安装. npm install express #安装express模块 npm install -g express #加上 -g 启用global安装 ...

  10. linux 服务自动调用

    php服务地址: http://192.168.2.117/web/index.php/buy/auctionselect 编写脚本service.sh,内容: #! /bin/sh crul htt ...