3.4:
C++运算符:加减乘除,求模。 运算符和操作数构成了表达式。
3.4.1:
当多个运算符被用于一个操作数时,用优先级和结合性判断先使用哪个运算符。优先级和常规数学方法一样(先乘除后加减,从左到右)。当优先级相同时,乘除从左到右。
3.4.2:
做除法(/)时,整数除法丢弃小数点,如果有一个操作属是浮点数,则结果为浮点数。
3.4.3:
求模运算符。
3.4.4:
C++自动执行很多类型转换:
1.初始化和赋值进行的转换
不同类型的变量赋值时,将值转换为接受变量的类型。 小转大没问题,大转小可能会丢失数据。(例如浮点转整形,转换采取截取,而非四舍五入)
2.以{ }方式初始化时进行的转换
{ }初始化被称为列表初始化。 列表初始化不允许缩窄(例如,不允许将浮点数赋值给整形),在能够储存的下的前提下,允许各种整形之间互相转换以及整形转换为浮点型。
有可能超出上限的转换不会被允许(如int x=22 char a=x,int的上限远比char高)
3.表达式中的转换
当同一个表达式中出现两种不同算数类型时,有两种情况:
第一种情况:自动转换(所有类型小于int,无浮点类型)
在计算表达式时,C++将所有小于int的的算数类型转换为int(ture转换为1,false转换为0)这样的转换称之为整形提升
具体过程:计算时将所有类型转换为int,计算完再将结果转换为将要赋值的类型(要赋值给什么类型就转换为什么类型)
这样转换的原因是int是最自然的类型,运算速度最快。
如果short比int短,则将unsigned short转换为int。如果short长度与int相等,则将unsigned short转换为unsigned int。这样的转换防止了数据丢失。
第二种情况:较小的类型转换为较大的类型(有大于int的类型,包含浮点类型)
在表达式中有浮点数时,C++将级别低的(较小的)转换为级别高的(较大的)
在表达式中无浮点数时,且级别高的类型可表示级别低的类型的所有取值时,将级别低的转换为级别高的,无论是否有符号。
在表达式中无浮点数,且级别高的类型不能表示级别低的类型的所有取值时,将两个操作数都转换为两个类型中的有符号类型的无符号版本。
4.传递参数时的转换
一般情况下用不到,传递参数时的转换通常由C++函数原型控制
5.强制类型转换
强制类型转换时的两种格式:
(将int型变量x修改为char型)
int x=55
char(x) // C语言格式
(char)x // C++格式
C++还引入了4个强制类型转换运算符,这里书中只介绍了其中一个:
(将int变量x修改为char型)
int x=55
static_cast<char>(x)
static_cast<>运算符相较于传统强制类型转换更为严格,这是因为传统强制类型转换有过多的可能性且过于危险(暂时不必深究)
先转换再相加和先相加再转换是不一样的,结果可能不同(因数据而异)。
最常见的使用强制类型转换的原因:使一种格式的数据满足不同的需要。