表达式是由一个或多个运算对象组成,对表达式求值将得到一个结果。字面值和变量是最简单的表达式,其结果就是字面值和变量的值。将运算符和多个运算对象组合起来构成复杂的表达式。
2.1 函数调用是个复杂的运算符,它对运算对象的数量没有限制。
2.2 使用重载运算符,运算对象类型和返回值都是由该运算符定义的,但是对于运算对象的个数、运算符优先级和结合律都是无法改变的。
2.3 左值和右值
2.3.1C++表达式要不就是左值,要不就是右值,在C语言中,为了帮助大家记忆:左值可以位于赋值语句的左侧,而右值只能位于赋值语句的右侧。
2.3.2 在C++里面就没有那么简单了,左值表达式的求值结果是一个对象,然而常量对象代表的某些左值不能位于赋值运算符的左侧运算对象。可以简单地归纳:当一个对象被用作右值的时候,用的是对象的值,当对象被用作左值的时候,用的是该对象在内存中的位置。
2.3.3 解引用运算符、下标运算符作用于左值运算对象都是左值
2.3.4 递增递减运算符其前置版本是个左值,后置版本是个右值,不能当做左值进行使用。-----不推荐将自增自减运算符和其他运算符混合使用
2.4 decltype类型
左值右值是不同的,如果表达式的求值结果是个左值,decltype作用于表达式(不是变量)得到引用类型,例如,p的类型是int * ,因为解引用运算符生成的是左值,所以decltype(*p)为int &,因为取地址运算符生成的是右值,decltype(&p)的结果是int **。
3.1 括号无视优先级,也就是说,在不确定的情况下,就加括号进行运算
3.2 优先级表格需要看下
4.1 int i=0; cout<<i<<" "<<++i<<endl; // 错误 可能出结果,但不同编译器可能处理不同
如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。cout<<i<<" "<<++i<<endl; 因为程序是未定义的,<<运算符没有明确规定何时对运算对象求值,是从前往后还是从后往前没定义,编译器可能先求++i再求i,也可能先求i再求++i。
4.2 有4种运算符明确规定了运算顺序,(1)逻辑与(&&),只有左侧为真才进行右侧运算(2)逻辑或(||),只有左侧为假才进行右侧运算(3)条件运算符(?:)(4)逗号运算符(,)从左向右进行求值。
4.3 *++iter的用法已经很常见了。