第四章:表达式
1、求值顺序:运算对象的求值顺序与优先级和结合律无关
i = f(i) + g(i)*h(i) + j(i); //如果这里的各个函数与i无关,则无所谓,如果内部都改变了i则会出错
- 如果几个函数影响同一个对象,则会产生未定义的行为
2、当拿不准求值顺序时,用括号来强制组合
3、赋值运算符:左侧运算对象必须是一个可修改的左值
4、对于++、--;最好使用前置版本,这样避免后置版本的复制副本的性能消耗
5、位运算:
- 因为在移位中,符号位没有规定如何处理,所以最好使用无符号类型来处理位移运算
- 右侧运算对象一定不能为负,而且要小于结果的位数,否则会出现未定义行为
- char类型的运算对象,首先会被提升为int类型
6、sizeof运算符:返回一个表达式或一个类型名字所占的字节数
const char *s = "hello"; sizeof(*s) = 1; //*s为第一个char:h;所以返回为1 sizeof(s) = 4; //为一个指针,返回为4 const char st[] = "hello"; sizeof(st) = 6 //对于一个数组,sizeof会返回大小的和;其中包括最后的‘\0’
- 对于string类型和vector类型sizeof只会返回该类型固定部分的大小;
- 测试结果sting类型固定为28;vector类型固定为16
7、类型转换:在大多数表达式中,小的形值会自动转换为大整型再计算
8、类型转换:除了在重载函数中使用const_cast外,其他地方应该避免使用强制类型转换