基本概念
一元运算符: 作用于一个运算对象的,比如: &(取地址) *(解引用) ++(自增) --(自减)
二元运算符: 作用于两个运算对象的,比如: + (求和) -(求差) ==(逻辑等) 所有运算符中二元运算符居多。
三元运算符: 作用于三个运算对象的, a > b ? a : b; ([?][ :]) 三元运算符。
运算符之间有优先级和结合律、求值顺序的规则,以方便在多个运算符共存的情况下掌握运算过程。
一般来说参与运算的所有对象都应该是同一个类型,但是在实际的运算过程中只要可以被转换为同一个类型就可以计算。
当操作自定义的类类型时,我们可以将运算符赋予自定义的运算流程,这就叫做运算符重载。
表达式分为左值和右值,右值使用的是对象的内容,而左值使用的是值的具体位置。或者说一句不太严谨,但容易理解的话:左值可被修改,而右值不能
常见的用到左值的运算:
1. 赋值运算符
2. 取地址符
3. 引用运算符和下标运算符
4. 内置类型和迭代器的递增递减运算
左值和右值间的一般规律是,使用右值的地方可以用左值替代,反之则不可以。
优先级与结合律
一般在多于一个运算符的表达式中才存在计算的先后顺序,才会有优先级和结合律的出现,而多个运算符的表达式成为复合表达式
在这里我们说到的优先级与结合律,与数学上所描述的概念完全一致,并且实际的运算表现也完全一致。
6 + 3 * 4 / 2 + 2 ((6 + ((3 * 4) / 2)) + 2)
与数学中的作用一样,括号可以无视优先级与结合律,先计算括号内的值,再计算括号外的值
在下述带队吗中
1. g()的返回值和h()的返回值相乘
2. f() 的返回值先与g()和h()的成绩相加,所得结果再与j()的返回值相加。
3. 对于这些函数的调用顺序C++标准中没有明确的定义
f() + g() *h() + j()
诚挚建议: 在处理符合表达式中的运算顺序无法确定时,尽量使用括号来确定表达式表达了你想要的意思。
#include <iostream> using std::cout; using std::endl; int main() { cout << "6 + 3 * 4 / 2 + 2= "<< 6 + 3 * 4 / 2 + 2 << endl; cout << "((6 + 3) * 4) / 2 + 2="<< ((6 + 3) * 4) / 2 + 2 << endl; cout << "(6 + 3) * (4 / 2 + 2)="<< (6 + 3) * (4 / 2 + 2) << endl; cout << "6 + 3 * 4 / (2 + 2)="<< 6 + 3 * 4 / (2 + 2) << endl; int ia[] = {0,2,4,6,8}; int last = *(ia + 4); cout << "*(ia + 4)=" << last << endl; last = *ia + 4; cout << "*ia + 4=" << last << endl; }