5.1 算术操作符

算术类型具有有限的长度,要注意计算后溢出的现象

求模操作(%)的操作数必须为整型

当两个操作数只有一个为负数时,操作结果的正负取决于机器。

5.2 关系操作符和逻辑操作符

关系、逻辑操作符使用算术或指针类型的操作数,并返回bool类型的值。

短路求值

&& 和 || 总是在仅靠左操作数无法确定结果时,再计算右操作数。

5.3 位操作符

用于整型和bitset类型

输入输出标准库(IO library)分别重载了位操作符>>和<<用于输入和输出,IO操作符为左结合

5.4 赋值操作符

数组名是不可修改的左值,因此不可用作赋值操作符号的目标。

一个优化的例子

谨防混淆

if(i == 42) 特别容易疏忽而写成 if(i=42),这类错误很难发现,故写作if (42 == i) 为好,可以及时报错

符合赋值操作符

a op= b; op=可以是以下10个操作符

5.5 自增和自减操作符

只有在必要时才使用后置操作符

前置操作只需加1(或减1)后返回结果即可;后置操作则必须先保存操作数原来的值,一遍返回未加1(或减1)之前的值作为操作的结果,对于复杂迭代器类型,这种额外工作可能会花费更大代价。

5.6 箭头操作符

获取所指向的类对象的成员

5.7 条件操作符

避免深度嵌套

==>  

5.8 sizeof操作符

sizeof ( expr )

将sizeof用于expr时,并没有计算表达式expr的值。若sizeof *p,并没有对p做解引用

对指针做sizeof操作返回存放指针所需内存大小;对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数

5.9 逗号操作符

从左向右计算,返回最右边表达式的值

5.10 复合表达式的求值

优先级:子表达式分组

粗略地,算术>移位>关系>逻辑>条件>赋值

结合性:操作符分组

右结合有,! ~ ++ -- + - * & (类型) sizeof new delete ?: 赋值与复合赋值

求值顺序

除了&&、||、(?:)、(,)规定了计算顺序,其它操作符都未指定操作数的求值顺序。

一个表达式里,不要在两个或更多的子表达式中对同一对象做自增或自减操作。

5.11 new和delete表达式

不提供显式初始化时,动态创建的对象与在函数内定义的变量初始化规则相同。

在类型名后面使用一对空圆括号,对动态创建的对象做值初始化。

对内置类型或没有定义默认构造函数的类型,采用不同初始化式有显著区别

删除0值指针是安全的,但没有任何意义;在delete指针之后,指针变成悬垂指针,应当立即将指针置0。

三种与动态内存分配相关的错误:

1)删除指向动态分配内存的指针失败,无法回收,造成内存泄露;

2)读写已删除的对象。

3)对同一个内存空间使用两次delete表达式。

5.12 类型转换

1、隐式转换

何时发生隐式转换

1)混合类型表达式中,操作数被转换为相同类型

2)用作条件的表达式被转换为 bool类型

3)用表达式对某个变量初始化(或赋值),该表达式转换为该变量类型

算术转换

整型提升:对于所有比int小的整型,包括char、signed char、unsigned char、short和unsigned short,都会被提升为int,否则就会提升为unsigned int

无符号数所定义的转换规则需保护操作数的精度

不将数组名转换为指针的情况:数组名用作取地址操作符的操作数或sizeof操作符的操作数,或数组对数组的引用进行初始化时

2、显式转换(强制类型转换)

cast-name<type> ( expression );  //type为目标类型,expression是被强制转换的值

强制转换的类型指定了在expression上执行某种特定类型的转换。

dynamic_cast

运行时识别指针或引用所指向的对象

const_cast

添加或删除const特性

static_cast

编译器隐式执行的转换或编译器不提供自动转换

reinterpret_cast

为操作数的位模式提供较低层次的重新解释,依赖于机器。

强制类型转换关闭或挂起了正常的类型检查,强烈建议程序员避免使用强制类型转换。

3、旧式强制类型转换

在引入命名的强制类型转换之前,显式强制转换用圆括号将类型括起来实现。


附:C++操作符优先级

操作符的优先级

操作符及其结合性

功能

用法

L

L

L

::

::

::

全局作用域

类作用域

名字空间作用域

:: name

calss :: name

namespace :: name

L

L

L

L

L

.

->

[]

()

()

成员选择

成员选择

下标

函数调用

类型构造

object.member

pointer->member

variable[expr]

name(expr_list)

type(expr_list)

R

R

R

R

R

++

--

Typeid

Typeid

显式强制类型转换

后自增操作

后自减操作

类型ID

运行时类型ID

类型转换

Lvalue++

Lvalue—

Typeid(type)

Typeid(expr)

Cast_name<type>(expr)

R

R

R

R

R

R

R

R

R

R

R

R

R

R

Sizeof

Sizeof

++

--

~

!

-

+

*

&

()

New

Delete

Delete []

对象的大小

类型的大小

前自增操作

前自减操作

位求反

逻辑非

一元负号

一元正号

解引用

取地址

类型转换

创建对象

释放对象

释放数组

Sizeof expr

Sizeof(type)

++lvalue

--lvalue

~expr

!expr

-expr

+expr

*expr

&expr

(type)expr

New type

Delete expr

Delete []expr

L

L

->*

.*

指向成员操作的指针

指向成员操作的指针

Ptr->*ptr_to_member

Obj.*ptr_to_member

L

L

L

*

/

%

乘法

除法

求模(求余)

Expr * expr

Expr / expr

Expr % expr

L

L

+

-

加法

减法

Expr + expr

Expr - expr

L

L

<<

>>

位左移

位右移

Expr << expr

Expr >> expr

L

L

L

L

<

<=

>

>=

小于

小于等于

大于

大于等于

Expr < expr

Expr <= expr

Expr > expr

Expr >= expr

L

L

==

!=

相等

不等

Expr == expr

Expr != expr

L

&

位与

Expr & expr

L

^

位异或

Expr ^ expr

L

|

位或

Expr | expr

L

&&

逻辑与

Expr && expr

L

||

逻辑或

Expr || expr

R

? :

条件操作

Expr ? expr : expr

R

R

R

R

R

=

*= , /= , %=,

+= , -=,

<<= , >>= ,

&= , |= , ^=

赋值操作

复合赋值操作

Lvalue = expr

Lvalue += expr等等

R

Throw

抛出异常

Throw expr

L

,

逗号

Expr, expr

转载于:https://www.cnblogs.com/itree/p/4803998.html

[c++primer][05]表达式相关推荐

  1. 性能测试(05)-表达式和业务关联-json关联

    1.使用场景 在对返回结果较复杂且为json结构的HTTP请求进行提取某一个值,以用作其他接口使用或者用来断言的等. 2.使用 添加步骤:选择线程组中的HTTP请求--右键"添加" ...

  2. 程序员基本功05表达式中的陷阱

    你尽管去做,其他的交给天意:读书笔记读书笔记 1.Java字符串的特点 当程序使用字符串.基本类型包装类实例是,尽量使用字符串直接量.基本类型值的直接量,避免通过new String().new In ...

  3. 内网ip正则表达式php,PHP使用正则表达式判断IP地址是否正确

    IP 地址想必大家都很熟悉,由 4 组 0~255 之间的数字组成,每个数字之间使用英文句号"."分割,例如 192.168.0.1 就是一个有效的 IP 地址.想要正确的使用正则 ...

  4. C++ Primer 学习笔记(第四章:表达式)

    2019独角兽企业重金招聘Python工程师标准>>> ##C++ Primer 学习笔记(第四章:表达式) [TOC] ###4.1 基础 左值和右值: 当一个对象被用作右值的时候 ...

  5. 1.3编程基础之算术表达式与顺序执行 05 计算分数的浮点数值

    #include <iostream> using namespace std; int main() {int a,b;cin>>a>>b;printf(&quo ...

  6. 《C Prime Plus》(第六版) 第05章 运算符、表达式和语句 例题集和编程练习

    OS: Mac Catalina 10.15.4 Hardware: Intel Core i9/16G 2667MHz DDR4 编译器版本:Mac Xcode 11.6  第05章 运算符.表达式 ...

  7. C++Primer 第10章lambda表达式

    C++Primer 第10章lambda表达式 泛型编程 咱们继续高歌猛进,下面我给大家继续讲关于算法的故事. 我们知道标准库容器中定义的算法大多数独立在算法之外,通常这些算法是通用的.它们可以处理不 ...

  8. C++ Primer Plus(嵌入式公开课)---第5,6章 循环和关系表达式 分支语句和逻辑运算符

    20220222 C++ Primer Plus - 第五.六章 附录: 1.ASCII码字符对照表 2.C++ 运算符优先级 第1-3章 第4章 复合类型 第5章 循环和关系表达式 5.1 for循 ...

  9. 《C Primer Plus》中文第六版 编程练习答案 第五章 运算符、表达式和语句

    C Primer Plus 第5章 运算符.表达式和语句 编程练习答案 ***先说一下关于 i++和 ++i 情况.*** 1.编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间.使用#de ...

  10. Ae 核心表达式及用法(05):路径相关

    createPath(points, inTangents, outTangents, is_closed) 根据一组点和切线创建路径对象. 例:使得物件出现在每一个路径点上. 先为"路径& ...

最新文章

  1. P4198 楼房重建 线段树 + 区间合并
  2. 根据DbSchema生成代码2
  3. vscode debug c++与opencv程序
  4. 【算法实践】搜狗信息流推荐算法交流.pdf(附下载链接)
  5. 33. MySQL Json
  6. 电子邮件系统是如何运作的?
  7. 传统进销存软件上云势在必行
  8. Excel导入SQL(VB.NET版)
  9. L1-049 天梯赛座位分配
  10. 【ct107d】独立键盘
  11. 1w+大学生在线学习,弘玑Cyclone与伯禹教育开展大学生RPA认证集训营
  12. matlab增强图像饱和度,matlab增强图像饱和度
  13. K8s使用Ceph纠删码池做持久化卷
  14. 【设计权限系统】ACL, DAC, MAC, RBAC, ABAC模型的不同应用场景
  15. 服装ERP软件体系究竟差在哪里?
  16. Cocos2d python
  17. 利用Chrom浏览器实现滚动截屏,不用下载插件,超级简单!
  18. 在C#开发WPF桌面应用程序调用OCX控件
  19. office 完美插件
  20. 一场猎杀AI的残酷游戏:把枪口对准人工智能,是为了吓退黑暗丛林中的对手...

热门文章

  1. NYOJ 2括号配对 栈的运用
  2. linux fb设备驱动,Linux FB 驱动讲解
  3. linux函数入参个数限制,PowerShell函数中限制数组参数个数的例子
  4. 翻译: Octave 入门教程
  5. Mac OS用Anaconda安装Jupyter Notebook
  6. 极客大学架构师训练营 性能优化 性能测试指标 性能测试 性能优化 CDN 网络 硬盘 缓存 异步 集群 第13课 听课总结
  7. Charles 4.2 HTTPS抓包,乱码设置,证书信任,证书安装
  8. 实现计算机和用户之间的关系,计算机系统概述
  9. mysql日志课程_【mysql课程七】 MySQL日志管理
  10. mysql建三行三列表格_基于另一个表中列的名称在mysql中创建表