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/