1.1 基本概念
表达式由一个或多个运算对象组成,对表达式求值将得到一个结果。
组合运算符和运算对象:
要理解含有多个运算符的复杂表达式,首先要理解运算符的优先级、结合律、以及运算对象的求值顺序
运算对象转换:
求值过程中,运算对象常常由一种类型转换成另外一种类型。
重载运算符:
为已存在的运算符赋予了另外一层含义
左值和右值:
当一个对象被用作右值时,用的是对象的值(内容),当一个对象被用作左值时,用的是对象的身份(在内存中的位置)。
1.2 算术运算符
一元运算符的优先级最高,接下来是乘除法,优先级最低的是加减法,所有运算符都满足左结合律。
布尔不应该参与运算
bool b = true;//被提升为1
bool b2 = -b; //b2=-1 ,为真,变为1,b2还是true
运算符%,负责计算两个整数相除所得的余数(符号应该和分子一样)。运算符/,负责计算两个整数相除所得的商(为整数)。
1.3 逻辑和关系运算符
返回值为布尔类型,运算对象和求值结果都是右值。
1.4赋值运算符
赋值运算符左侧运算对象必须是一个可修改的左值;满足右结合律。
1.5 递增(++)和递减(–)运算符
有前置和后置两种形式
例子:
int i = 0,j;
j = ++i; //j=1,i=1
j = i++; //j=1,i=2
如果我们想在一条复合表达式中即将变量加减1又能使用它原来的值,可以使用后置版本的递增和递减。
1.6 成员访问运算符
点运算符和箭头运算符:
点运算符获取类对象的一个成员
箭头运算符作用于一个指针类型的运算对象,结果是一个左值。
1.7 条件运算符
形式(? :)
cond ? expr1 : expr2;
满足右结合律
习题:
1.8 位运算符
移位运算符满足左结合律,优先级处于中间,比算术运算符优先级低,但比关系运算符、赋值运算符和条件运算符的优先级高,在使用多个运算符时,注意加上括号。
1.9 sizeof运算符
返回一条表达式或一个类型名字所占的字节数,满足右结合律。
练习:
1.10 逗号运算符
含有两个运算对象,按照从左向右的顺序。常用于for循环中。
1.11 类型转换
在C++语言中,某些类型之间有关联,也已用另一种关联类型的对象或值来替代。
隐式转换:
类型转换是自动执行的,无须程序员介入。
算术转换:
定义了一套类型转换的层次,其中运算符的运算对象将转换成最宽的类型。
例子:
其他隐式类型转换
数组转换为指针
指针的转换
转换成布尔类型
转换成常量
显式转换
这种方法本质上是非常危险的。
强制类型转换形式如下与c语言不一样:
cast-name< type >(expression)
type是要转换的目标类型而expression是要转换的值。
cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。
运算符优先级表格