4.1.1 基本概念
c++定义了
作用于一个对象一元运算对象一元运算符(取地址符,解引用符)
作用于两个对象二元运算对象二元运算符(==,乘法)
作用于三个对象....
函数调用特殊,它对运算对象的数量没有限制
组合运算符和运算对象
运算对象转换
重载运算符
运算符作用于类类型的运算对象时,用户可以自定义其含义
称之为 重载运算符(overloaded operator)
IO库的 >> 和 << ,迭代器使用的运算都是重载的运算符
左值和右值
当一个对象被用作右值时,用的是对象的值(内容)
当一个对象被用作左值时,用的时对象的身份(内存中的位置)
- 赋值运算符需要一个左值作为运算对象,得到的结果也仍然是一个左值
- 取地址符作用于一个左值对象,返回一个指针,是右值
- 内置解引用运算符,下标运算符,迭代器运算符,string和vector的下标,的求值都是左值
- 内置类型和迭代器的递增减运算符作用于左值运算对象
关键字decltype作用于表达式(非变量)得到一个引用类型。
p的类型是 int*
因为解引用符号生成左值
decltype(*p)的结果是 int&
decltype(&p)结果是 int**一个指向整形指针的指针
4.1.1优先级和结合律
括号无视优先级和结合律
优先级和结合率有何影响?
4.1.3求值顺序
对于没有指定执行顺序的运算符来说,如果表达式指向并修改同一对象,会产生错误
int i= 0;
cout << I << “ ”<< ++I << endl; //未定义的
有4种运算符明确规定了运算对象的求值顺序
- && 规定先求左侧运算对象的值,只有当左侧运算对象的值为真时才继续求右侧运算对象的值
- ||
- ?: (条件运算符)
- ,(逗号运算符)
求值顺序,优先级,结合律
建议:处理复合表达式
以下两条经验
1.拿不准的时候用括号
2.如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象