表达式---C++ 基础

来源:互联网 发布:linux复制所有文件 编辑:程序博客网 时间:2024/06/07 06:50

前言

这一章相对来说比较轻松,主要涉及到的是c++中常见的运算符。一些耳熟能祥的东西我就不打算写在博客里了,主要分析一些细微的点。虽然不要注重细节,但是不知道细节就没有好的语言基础。骐骥千里,非一日之功。

C++ 中提供了许多的运算符,算术运算符、逻辑和关系运算符、赋值运算符、位运算符等等。按照操作数的数量,可以分为一元运算符、二元运算符、三元运算符,一般的来说它们之间的优先级也是一元大于二元,二元大于三元。

基础

1.左值和右值

一个表达式,不是左值就是右值。这个概念从C语言继承过来(左值可以位于赋值语句的左边,右值不能)。

在C++中,左右的概念没有那么简单。但是记住一句话就行:

  • 对象被当作右值时,用的是它的值(内容)
  • 对象被当作左值时,用的是它的身份(在内存中的位置)

因此,左值可以被当作右值来使用,但是右值不能被当作左值来使用。

2.逻辑和关系运算符

关于逻辑运算符,我们要知道 短路求值,并且在写代码时时刻记住这一点。

  • 对于 & 运算,左边为真才对右边进行运算,左边为假就直接返回了
  • 对于 | 运算,左边为假才对右边进行运算,左边为真就直接返回了

3.递增和递减运算符

++,-- 操作有前置版本和后置版本,注意一点,后置版本需要将原始值保存下来,以便于返回这个未修改的版本,如果我们不需要修改前的值,这个操作就是一种浪费。

因此,在使用时,如果明白自己的意图,就可以区别使用。如果只需要增加一,那就使用前置版本。

4.位运算

在算法里,这个值得开一个专题来讲。位运算相比算术运算会更快一些,但是会有一些小技巧。这里提一个小点。

移位运算:左移右边是补0,而右移需要根据环境来决定补0还是补1,因此,我们在进行位运算时,最好将数据类型设置成 unsigned 无符号类型,也要注意有符号类型隐式转成无符号类型。

5.类型转换

分为显示转换和隐式转化。

显示转换有:

  • static_cast : 只要不包含底层const,都可以使用
  • const_cast : 只能改变运算对象的底层const
  • reinterpret_cast : 为运算对象的位模式提供较低层次的重新解释,本质依赖机器,看情况使用

优先级

从上到下,优先级依次降低(取成员高、后置比前置高、一元比二元高、二元比三元高、算数比逻辑高、算数比移位高、赋值低、逗号最低)

  • :: 作用域

  • . 成员选择
  • -> 成员选择
  • [] 下标
  • () 函数、类型构造

  • a ++ 后置递增
  • a -- 后置递减
  • typeid(a) 类型ID、运行时类型ID
  • static_cast<int>(a) 类型转换

  • ++ a 前置递增
  • -- a 前置递减
  • ~ a 位求反
  • ! a 逻辑非
  • - a 一元负号
  • + a 一元正号
  • * a 解引用
  • & a 取地址
  • (int)a 类型转换
  • sizeof(a) 对象大小
  • new 创建对象
  • new int[] 创建数组
  • delete 释放对象
  • delete [] 释放数组

  • ->* ptr_mem 指向成员选择的指针
  • .* prt_mem 同上

  • a * b
  • a / b
  • a % b 取模

  • a + b
  • a - b

  • a << 1 左移
  • a >> 1 右移

  • a < b 小于
  • a <= b 小于等于
  • a > b 大于
  • a >= b 大于等于

  • a == b 相等
  • a != b 不相等

  • a & b 位与

  • a ^ b 位异或

  • a | b 位或

  • a && b 逻辑与

  • a || b 逻辑或

  • a ? b : c 条件

  • a = 10 赋值
  • a *= 100
  • a -= 100
  • a += 100
  • a %= 100
  • a <<= 100
  • a >>= 100
  • a &= 100
  • a |= 100
  • a ^= 100

  • throw 抛出异常

  • a , b 逗号