1.运算符:
算术表达式:由运算对象和运算符构成;
eg:10+20(10和20就是运算对象,+就是运算符)
2.算术运算符:
类型:+ - * / % += -= /= %= *=
注意:
1./的取整:
如果/的所有对象都是整数,/的功能就是取整
eg: 5/3==1,5/2==2
2./的除法运算
如果/有一个是实型,/的功能就是除法运算
eg:5/2.0==2.5;
//可根据自身需要的功能合理使用
3.%取余运算符(难点)
eg:5%2==1; 3%5==3;(在不够除时,余数就是除数本身)
进阶: n%3==0,1,2(可能产生的余数值)
再进阶: data%n== 0,1,2,3...n-1;(可以产生n-1种余数值)(data是一个随机的数字,每次执行都会变化)(n是一个固定的值)
案例:如果rand()函数产生一个随机数>0,请使用rand()产生60--100的随机数:
分析:rand()能产生>0的随机数字,60--100可以被看成(60+0,60+40),也就是说我们需要产生一个(0,40)的数值
根据上面进阶可知,用rand()%41=就可以产生(0,1,2,3....40)的任意数值,所以说代码就是:
rand()%41+60;
2.复合运算符:
类型:+= -= /= %=
eg: a+=b //a=a+b
注意:一定要将=号右边的看做整体运算
eg: a*=4+5;//a=a*(4+5);(4+5)是一个整体
运算的方向:从右往左:
eg:a+=a-=a*=a;(假设a=4)
先运算a*=a,a==16;(a=4*4)
再运算a-=a,a==0;(a=16-16)
后运算a+=a,a==0;(a=0+0)
3.关系运算符
类型:<,>,==,<=,>=,!=
用于判断运算对象之间的关系;
eg:a<=b,....等等之类的
4.逻辑运算符:
类型:&& || !
1.&& 逻辑 "与":
eg:A&&B 只有当AB表达式都为真的时候,整个表达式才为真,返回一个1
若有任意一个假的就返回0;
注意:逻辑与&&的短路特性:
也就是说,假如A&&B中,A的表达式已经是假的了,就不会执行B的表达式,同时B的真假决定不了整个表达式的结果2.||逻辑或:
eg:A||B 但A,B其中一个表达式为真的时候,整个表达式为真,返回一个1
当A,B都为假时,整个表达式就为假,就返回0;
注意:逻辑或||的短路特性和逻辑与&&的特性原理一样3.!逻辑非:
!真==假; !假==真//使用方法?插入知识点:rand()函数://观看rand函数笔记
5.位运算(二进制位运算)
1.& 按位与
语法:全1为1(两个1时才为1) 有0为0(有0就为0)
特点:和1相与保持不变 和0相与为0
运用场景:将指定位清0
eg: 1100 0011
& 1111 0000
-------------//1100和1111相与所以保持不变,0011和0000相与全变成0
1100 0000
案例:date为一个字节,将data的第三和第4位清0,其他位保持不变(看到清0,就使用&)
unsigned char data;
data = data & 1110 0111;//位数是从0开始数的(顺序从右往左数),利用遇1不变,遇0为0,的特性进行清0操作
//但是上面的写法是错误的,在c++中会把1110 0111看成一个十进制数字,所以我们应该要将其改为16进制
data = data & 0xe7//ok
data &= 0xe7; //2进位和16进制的转换笔记:2.| 按位或
语法:有1为1 全0为0(两个0的时候才为0)
特点:和1或-> 置1,和0或-> 保持不变
运用场景:将指定位 置1
eg: 1100 0011
| 1111 0000
--------------
1111 0011
案例:date为一个字节,将data的第三和第4位置1,其他位保持不变
data = data | 0110 0000;
data = data | 0x60;//ok
3.~按位取反
语法:0变1,1变0;(简单,相反就对了)
eg: ~1111 0000==0000 11114.^按位异或
语法:相同为0 不同为1
特点:和1异或取反 和0异或保持不变
使用场景:将指定位 发生翻转
eg: 1100 0011
^1111 0000
-------------
0011 0011
^1111 0000
------------
1100 0011
5.左移<<:左边丢弃,右边补0
移动的位数不能超过 自身的宽度;
data=1100 0011;data=data<<3;//意思是向左移动三位(尖端指向左边)
|
1 1 0 | 0 0 0 1 1 0 0 0(后面三位是补进来的)
|
例子:
data=0000 0001 data=data<<0; data=0000 0001==1(10进制)==data*2^0;
data=0000 0001 data=data<<1; data=0000 0010==2(10进制)==data*2^1;
data=0000 0001 data=data<<2; data=0000 0100==4(10进制)==data*2^2;
data=0000 0001 data=data<<3; data=0000 1000==8(10进制)==data*2^3;
......//一开始都是1;6.右移>>:右边丢弃 左边补0(补1)//补1还是补0,是由你的编译器决定
其实只有当负数的时候编译器才会考虑补1还是补0;其他情况默认都是补0
负数:右边丢弃 左边补0 (逻辑右移)
负数:右边丢弃 左边补1 (算术右移)//是逻辑还是算术右移这些都是由编译器决定的,可以通过测试判断是那种运算
data=1000 0000 data=data>>0; data=1000 0000==128(10进制)==data/2^0;
data=1000 0000 data=data>>1; data=0100 0000==64(10进制)==data/2^1;
data=1000 0000 data=data>>2; data=0010 0000==32(10进制)==data/2^2;
data=1000 0000 data=data>>3; data=0001 0000==16(10进制)==data/2^3;
//右移就是除法运算
6.三目运算符 ? :
表达式1 ? 值1:值2
如果表达式1为真,整个表达式的值为 值1(引用)
如果表达式1为假,整个表达式的值为 值2(引用)
eg: 10>20? 10:20 //输出结果为20(值2)