基础
基本概念
C++定义了一元运算符和二元运算符:
- 作用于一个对象的运算符是一元运算符:取地址符(&)和解引用符(*)
- 作用于两个运算对象的运算符是二元运算符:相等运算符(==)和乘法运算符(*)
- 作用于三个运算对象的的三元运算符
一些符号既能作为医院运算符也能作为二元运算符:
* 作为一元运算符时执行解引用操作,作为二元运算符时执行乘法操作。
组合运算符和运算对象
理解运算符的优先级、结合律以及运算对象的求值顺序。
运算对象转换
- 整数能转换成浮点数,浮点数也能转换成整数,但是指针不能转换成浮点数
- 小整数类型(bool、char、short等)通常会被提升成较大的整数类型(主要是int)。
重载运算符
当运算符作用于类类型的运算对象时,用户可以自定义其含义。
重载运算符时,运算对象的类型和返回值都是由运算符定义的,但是运算对象的个数、运算符的优先级和结合律都是无法改变的
左值和右值
当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的文章)。
重要的原则:
- 需要右值的地方可以用左值来代替,不能把右值当成左值
- 当一个左值被当成右值使用时,实际使用的是它的内容(值)
运算符用到左值的:
- 赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果也仍然是一个左值
- 取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,这个指针是右值
- 内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果都是左值
- 内置类型和迭代器的递增递减运算符作用于左值运算对象,其前置版本所得的结果也是左值
优先级与结合律
解引用和指针运算:
int ia[] = {0,2,4,6,8};//含有5个整数的数组 int last = *(ia + 4);//把last初始化成8,也就是ia[4]的值 last = *ia + 4;//last=4,等价于ia[0]+4
结合律对表达式产生影响的一个典型示例是输入输出运算:
cin >> v1 >> v2;
求值顺序
没有指定执行顺序的运算符,表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为:
int i = 0; cout << i << " " << ++i << endl;
求值顺序、优先级、结合律
运算对象的求值顺序与优先级和结合律无关,在一条形如f()+g()*h()+j()的表达式中:
- 优先级规定,g()的返回值和h()的返回值相乘
- 结合律规定,f()的返回值先与g()和h()的乘积相加,所得结果再与j()的返回值相加
- 对于这些函数的调用顺序没有明确规定

浙公网安备 33010602011771号