2020-C++高级程序设计-C++ 表达式
C++ 表达式
- C++中的表达式由以下三种组成:
- operand
- operator
- others
 
- 求值需要受到以下元素的制约:
- 优先级
- 结合性
- 类型转换约定(强制类型转换)
- coresion
- casting
 
- 求值次序:收到编译器的影响
- 副作用:破坏可移植性,降低可读性
- 视频1:43
 
- 注意:防止溢出
- 类型转换是由compiler决定的
- type casting强制类型转换
- 例子:d + x/y*d + ++y:初始条件全为int
- 强制类型转换:d + (double) x/y*d + ++y
 
1. 基本运算符
| 运算符 | 名称 | 作用 | 
|---|---|---|
| << | 插入运算符 | 将后面的插入流中去,也可以被理解为重定向运算符 | 
| >> | 取出运算符 | 按顺序读入参数,以空格为分隔符 | 
| ~ | 取反运算符 | 按位取反 | 
| * | 指针运算符 | 取出指针所对应的内存地址中的值 | 
| sizeof | 求字节数运算符 | 返回该变量或者数据结构占据的字节数 | 
| -> | 指向成员运算符 | 用于拿到成员中变量 | 
- 二元运算符
- 逗号运算符:表示按照顺序向下计算,并且将最后的计算结果赋值给最左边的
- a = 3 * 5,a * 4 => a = 60
 
2. 表达式的种类
- 表达式可以大致分为一下几种:
- 算术
- 关系和逻辑
- 赋值
- 逗号
- 字位运算符
 
- 操作符可以重载
- 实现多态,避免多函数
- 无权利定义操作符
 
2.1. 赋值表达式
- C++为左值表达式
- 左值 = 右值表达式
- 左值:可以出现在赋值表达式左部的表达式,具有存放数据的空间。
- 类型不同时,先计算右值表达式的值,然后转换为左值表达式,之后赋值
 
- 11中出现了右值表达式,int && x = 1
2.2. 算术表达式
- 增量和减量操作符
- 前增量(前减量):++a(–a)
- 后增量(后减量):a++(a–)
- 提高编译结果的执行效率
 
| 1 |  | 
2.3. 条件表达式
- <exp1>?<exp2>:<exp3>
- 唯一的三目运算符,不允许进行重载
- 只计算一个运动分量
- 如果<exp2>和<exp3>的值类型相同且均为左值,则该条件运算符表达式为左值表达式。
- 可以嵌套(满足就近原则)
2.4. 逗号表达式
- 也就是进行连续计算
- <exp1>,<exp2>,...,<expn>
- <expn>的值是逗号表达式的值
| 1 |  | 
- 如<exp n>为左值,则该逗号表达式为左值
2.5. 字位运算符表达式
- 对于整形数二进制位(bit)的操作,将整形数看做二进制序列
- 复位和置位进行操作
 
| 操作符名 | 操作符 | 参与运算元数 | 备注 | 
|---|---|---|---|
| 按位取反 | ~ | 单目 | - | 
| 按位与 | & | 双目 | 复位 | 
| 按位或 | | | 双目 | 置位 | 
| 异或 | ^ | 双目 | - | 
- 对于异或^:- 与全0的二进制串进行运算:不变
- 与全1的二进制串进行运算:取反
- 与本身的运算:清零
- 与同一个对象进行异或运算两次:还原,应用:进行加密
 
- 交换两个整数x和y:如何写函数
| 1 |  | 
2.6. 移位运算符表达式
- 不仅仅只是进行移位运算
- 还有将相应的数据进行转换。
2.7. 处理Overflow
- 在C++中计算出负值不正确的结果:我们统一称为exception
2.8. 左值表达式和右值表达式
- 左值表达式:++i
- 右值表达式:i++
2020-C++高级程序设计-C++ 表达式
      https://spricoder.github.io/2020/07/01/2020-C-plus-plus-advanced-programming/2020-C-plus-plus-advanced-programming-C++%20%E8%A1%A8%E8%BE%BE%E5%BC%8F/