这一章相对来说比较轻松,主要涉及到的是c++中常见的运算符。一些耳熟能祥的东西我就不打算写在博客里了,主要分析一些细微的点。虽然不要注重细节,但是不知道细节就没有好的语言基础。骐骥千里,非一日之功。
C++ 中提供了许多的运算符,算术运算符、逻辑和关系运算符、赋值运算符、位运算符等等。按照操作数的数量,可以分为一元运算符、二元运算符、三元运算符,一般的来说它们之间的优先级也是一元大于二元,二元大于三元。
1.左值和右值
一个表达式,不是左值就是右值。这个概念从C语言继承过来(左值可以位于赋值语句的左边,右值不能)。
在C++中,左右的概念没有那么简单。但是记住一句话就行:
对象被当作右值时,用的是它的值(内容)对象被当作左值时,用的是它的身份(在内存中的位置)因此,左值可以被当作右值来使用,但是右值不能被当作左值来使用。
2.逻辑和关系运算符
关于逻辑运算符,我们要知道 短路求值,并且在写代码时时刻记住这一点。
对于 & 运算,左边为真才对右边进行运算,左边为假就直接返回了对于 | 运算,左边为假才对右边进行运算,左边为真就直接返回了3.递增和递减运算符
++,-- 操作有前置版本和后置版本,注意一点,后置版本需要将原始值保存下来,以便于返回这个未修改的版本,如果我们不需要修改前的值,这个操作就是一种浪费。
因此,在使用时,如果明白自己的意图,就可以区别使用。如果只需要增加一,那就使用前置版本。
4.位运算
在算法里,这个值得开一个专题来讲。位运算相比算术运算会更快一些,但是会有一些小技巧。这里提一个小点。
移位运算:左移右边是补0,而右移需要根据环境来决定补0还是补1,因此,我们在进行位运算时,最好将数据类型设置成 unsigned 无符号类型,也要注意有符号类型隐式转成无符号类型。
5.类型转换
分为显示转换和隐式转化。
显示转换有:
static_cast : 只要不包含底层const,都可以使用const_cast : 只能改变运算对象的底层constreinterpret_cast : 为运算对象的位模式提供较低层次的重新解释,本质依赖机器,看情况使用从上到下,优先级依次降低(取成员高、后置比前置高、一元比二元高、二元比三元高、算数比逻辑高、算数比移位高、赋值低、逗号最低)
:: 作用域