第四章 表达式
强制类型转换(显式转换)
cast-name<type>(expression)
cast-name 是 static_cast 、dynamic_cast、const_cast、reinterpret_cast中的一种。
旧式强制类型转换
(type) expr
type (expr)
note
算术运算符满足左结合律,即运算符的优先级相同,将按照从左向右的顺序组合运算对象。
. 的优先级比*高
有四种运算符规定了运算对象的求值顺序,&& || ?: ,
int i = f1() + f2() 可能会出错,因为无法知道哪个先调用。
bool a = true;
bool b = -a; // b = true
%取余,又称取模,参与取模运算的必须是整数。
在除法运算中,如果两个运算对象的符号相同,则商为正(如果不为0),否则商为负。
商一律向0取整。
在逻辑和关系运算符中,只有!是右结合,其余皆为左结合
在表达式中,类型会向上提升,比如bool 转int。
列表初始化不能存在丢失信息的风险。例如 int k = { 2.718 } // 报错:窄化变换// 第二章内容。
复合赋值运算符例如+= -= *= \= %= <<= >>= &= ^= |=
与 a = a op b 的区别是左侧运算对象的求值次数,复合求值一次,普通两次,一次是作为右边子表达式的一部分求值,另一次是作为赋值运算的左侧运算对象求值。
* iter++ 先计算++ 返回未++的指针,然后*解引
位运算中,char 类型会先提升为int 类型。
sizeof 运算符返回一条表达式或一个类型名字所占的字节数。
对解引用指针执行sizeof 运算能得到指针指向对象所占空间的大小,指针不需要有效。
sizeof 运算不会把数组转换成指针来处理。
对string 或vector执行sizeof 运算只返回该类型固定部分的大小,不会计算对象中元素占用了多少空间。
如果一个运算对象是无符号类型,另一个运算对象是带符号类型,且无符号数大于带符号数,则带符号对象转换成无符号的。如果带符号的大于无符号的,则无符号转成带符号,如果不能,带符号转无符号。