1.运算符的优先级只规定运算对象的组合方式,没有说明运算对象按照什么顺序求值,因此如果改变了某个运算对象的值,在表达式其他地方最好就别用了。
举个例子 *beg = toupper(*beg++);
2.简单来说左值是某个位置的值的引用,右值是某个值。左值能当右值用,右值不能当左值用。(还有一种理解,等号左边和等号右边的值)左值表达式返回的是引用。不同运算符返回不同的左值或是右值,具体要翻书查询
3.将参数设置为引用可以避免对元素的拷贝。
4.逻辑与运算符和逻辑或运算符都是先求左侧运算对象的值再求右侧运算对象的值,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧运算对象的值。这种策略称为短路求值。
而相等性运算符未定义求值顺序。
5.指针和整形不能相互转化。
6.递增运算前置版本(++j)返回左值,递增运算后置版本(j++)返回右值。尽量使用前置版本减小开销。
7.嵌套条件运算符和赋值运算符是左结合律
8.使用移位运算符时建议只处理无符号类型
9.逗号运算符返回的是最右边的结果
10.static_cast和reinterpret_cast的区别在于,只有reinterpret_cast能直接将非void*指针转化为其他类型的指针。尽管如此,我们还是可以用static_cast间接改变指针类型。
int main(){
int a;
void* b = &a;
char* c = static_cast<char*>(b);
}
11.隐式类型转换–算术转换–整型提升–无符号类型运算规则:
如果无符号类型长度大于或等于符号类型长度,则会将符号转化为无符号。
如果小于,则要看无符号类型是否所有值都能存在符号类型里面。