目录
一.算术操作符
1.要点:
二.负数原码,反码,补码的互推
1.按位取反操作符:~(二进制位)
2.原反补互推演示
三.进制位的表示
1.不同进制位的特征:
2.二进制位表示
3.整型的二进制表示
四.移位操作符
1.左移操作符
2.右移操作符
五.位操作符
1.使用禁忌:
2.位操作符一览:
3.位操作符的注意要点:
4.位操作符使用演示:
5.位操作符的应用:“不创建临时变量实现两个数的交换”
6.位操作符的应用:“求一个整数存储在内存的二进制中1的个数”
法一:利用移位操作符
法二: 利用二进制原理
六.赋值操作符
1.连续赋值(接收上一个运算的返回值)
2.复合赋值符
七.逻辑操作符
1.逻辑操作符一览
2.区分 “逻辑与或” 和 “按位与或”
3.经典例题
例1:逻辑与的“短路特性”——前面为0判定时,后面不操作
例2:逻辑或的“反短路特性”——前面为真判定时,后面不操作
八.单目操作符
1.单目操作符一览
2.sizeof特性与操作规范 (操作数的类型长度)
九.其他操作符
1.下标引用操作符
2.函数引用操作符
3.访问结构的成员操作符
九.算术转换
十.隐式类型转换
1.概述:
2.整型提升:
一.正负数的整型提升
3.截断:
十一.问题表达式问题
原理:优先级虽然存在,但与执行的次序存在不确定性
例1:无法判断三个fun( )哪个先执行
例2:无法判断是c开始先去+"--c",还是先执行--c再+c
十二.逗号表达式
1.逗号表达式
2.逗号表达式的实际应用——简化代码
一.算术操作符
+ - * / %
1.要点:
- 除了%操作符之外,其他操作符都可以作用于整数和浮点数
- 对于/操作符如果两个操作数都为整数,则执行整数除法;只要有浮点数,浮点数除法
- %操作符的两个操作数必须为整数。返回的是整除后的余数
- 除法 / 想要得到小数,保证除数和被除数中至少有一个是浮点数
(5.0/2——>2.5)
二.负数原码,反码,补码的互推
1.按位取反操作符:~(二进制位)
~:二进制位0变1,1变0
00000000000000000000000000000001 11111111111111111111111111111110 按位取反后
2.原反补互推演示
原理:
例子:
三.进制位的表示
1.不同进制位的特征:
进制位的表示范围都为(0~进制位-1)
例:10进制位(0~9) 8进制位(0~7)
2.二进制位表示
进制位从右往左,分别代表进制位的数×进制位的0到若干次方
例:二进制表示15
3.整型的二进制表示
四.移位操作符
1.左移操作符
- 补码移动,空缺补0
- 左移效果:扩大二倍 (负数也适用,例:4->8,-4->-8)
PS:涉及原反补码的运算,不清楚+1-1的可以看本博客原反补码块知识点
图示:
2.右移操作符
- 逻辑右移:左边丢弃,左边补0
- 算术右移(正负数):右边丢弃,左边补原符号位(保持原来的符号位)
图示:
五.位操作符
1.使用禁忌:
- 不要移动负数位,此行为未定义!
2.位操作符一览:
1.按位与&:有0为0,全1为1
2.按位或 |:有1为1,全0为0
3.按位异或^:相同为0,相异为1
3.位操作符的注意要点:
- 他们的操作数必须是整数!
- 位操作的应用场景,一般是补码层面的运算
4.位操作符使用演示:
5.位操作符的应用:“不创建临时变量实现两个数的交换”
原理:
- 任何数 和0 亦或^都是它自己,两个相同的数亦或^都为0
- 运算后不会发生进位
int main() { int a=10; int b=20; //二进制层面,每一位只有0/1两种可能 a=a^b; 此时,a相当于在二进制层面上,原来ab两数二进制各位的集合 b=a^b; 根据相同数亦或为0,b中存储的是集合排除掉b后的结果,即本来的a a=a^b; 根据相同数亦或为0,此时存储的是集合排除掉本来的a后的结果,即b }
6.位操作符的应用:“求一个整数存储在内存的二进制中1的个数”
法一:利用移位操作符
原理:按位与&1,按位右移。统计32次后按位与1结果之和
代码演示:
int main() { int count=0; for(int i=0;i<32;i++) { if((n>>1)&1)==1) { count++; } } return 0; }
法二: 利用二进制原理
原理:
- 模%2相当于拿到二进制位中的最右边一位
- 除/2相当于拿到二进制位中的最右边边以外的二进制序列
六.赋值操作符
1.连续赋值(接收上一个运算的返回值)
2.复合赋值符
七.逻辑操作符
1.逻辑操作符一览
- &&:逻辑与
- ||:逻辑或
2.区分 “逻辑与或” 和 “按位与或”
3.经典例题
例1:逻辑与的“短路特性”——前面为0判定时,后面不操作
例2:逻辑或的“反短路特性”——前面为真判定时,后面不操作
八.单目操作符
1.单目操作符一览
2.sizeof特性与操作规范 (操作数的类型长度)
操作规范:
特性:sizeof内部操作不改变原值
PS:截断过程
九.其他操作符
1.下标引用操作符
2.函数引用操作符
():接受一个或多个操作数:第一个操作数是函数名,其余的操作数就是传递给函数的参数
演示:
3.访问结构的成员操作符
演示:
九.算术转换
十.隐式类型转换
1.概述:
2.整型提升:
一.正负数的整型提升
方法:高位补符号位
3.截断:
- 与整型提升(char赋值给int)相对的,当int(整型)赋值给char时,会发生截断。
- 而运算时依照规定,又要进行整型提升
- 涉及到运算时,才会发生截断
十一.问题表达式问题
原理:优先级虽然存在,但与执行的次序存在不确定性
例1:无法判断三个fun( )哪个先执行
例2:无法判断是c开始先去+"--c",还是先执行--c再+c
十二.逗号表达式
1.逗号表达式
- 逗号表达式,就是用逗号隔开的多个表达式
- 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
2.逗号表达式的实际应用——简化代码
优化前:
a=get_val(); count_val(a); while(a>0) { 业务处理 a=get_val(); count_val(a); }
优化后:
a=get_val(); count_val(a); while(a=get_val(),count_val(a),a>0) { 业务处理 }