超详细的操作符讲解

操作符的分类 算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
1.算术操作符

+-*/%

(1) % 是取余字符,即求余数,两个操作数必须为整数,返回的是整除之后的余数。如
(10除以3,商3余1)
10/3=1;
10%3=1;
除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
2.位移操作符(进行运算的都是补码)
<< 左移操作符 >> 右移操作符注:移位操作符的操作数必须是整数,移动位数只能是正整数(不能为负数)。 如 3<<12(表示3左移12位) 3>>12(表示3右移12位)

(1)左移(左边删掉,右边补0)
3的补码(反码,补码都一样)
00000000000000000000000000000011
3<<12(左移12位)
00000000000000000011000000000000
-3的原码
10000000000000000000000000000011
-3的反码(原码符号位不变,其余取反)
11111111111111111111111111111100
-3的补码(反码+1)
11111111111111111111111111111101
-3<<12(-3左移12位)(补码)
11111111111111111101000000000000
转化成反码(即-1)
11111111111111111100111111111111
转换成原码(符号位不变,其余为取反)
10000000000000000011000000000000
原码即为最终结果
(2)右移
(2).1逻辑右移(左边补0,右边多出来的丢掉)
如 15>>3
15的原码(反码、补码都一样) 000000000000000000000000000001111 15>>3 00000000000000000000000000001000

如-15>>3
-15的原码 10000000000000000000000000001111 -15的反码 11111111111111111111111111110000 -15的补码 11111111111111111111111111110001 -15>>3 00011111111111111111111111111110

(2).2算术右移(左边补最高位,右边丢弃)
如 8>>3
8的原码 00000000000000000000000000001000 8>>3 00000000000000000000000000000001

【超详细的操作符讲解】如-16>>3
-16的原码 10000000000000000000000000010000 -16的反码 11111111111111111111111111101111 -16的补码 11111111111111111111111111110000 -16>>3 11111111111111111111111111111110

3.位操作符(进行运算的都是补码)
&按位与(两个都是1则结果为1,否则为0) |按位或(至少有一个1则结果为1) ^按位异或(相同为0,不同为1) 注:他们的操作数必须是整数。

以8位二进制为例
3&5
00000011(3) 00000101(5) 00000001(3&5)

3|5
00000011(3) 00000101(5) 00000111(3|5)

3^5
00000011(3) 00000101(5) 00000110(3^5)

4.赋值操作符(=)
int a = 10; int x = 0; int y = 20; a = x = y+1; //连续赋值

复合赋值符
+=如a=a+b可以写成 a+=b -=a=a-ba-=b; *=a=a*ba*=b; /=...... %=...... >>= <<= &= |= ^= 这些运算符道理都一样

5.单目操作符
!逻辑反操作 -负值 +正值 &取地址 sizeof操作数的类型长度(以字节为单位) ~对一个数的二进制按位取反 --前置、后置-- ++前置、后置++ *间接访问操作符(解引用操作符) (类型)强制类型转换

! 逻辑反操作
0变非0,非0变0
例如 a=3,b=0; 则 !a=0,!b=1(或其他非0数)

前置++和前置- -(先++或- -,再运算)
int main() { int a = 10; int x = ++a; //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。 int y = --a; //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10; return 0; }

后置++和后置- -(先运算再++或- -)
#include int main() { int a = 10; int x = a++; //先对a先使用,再增加,这样x的值是10;之后a变成11; int y = a--; //先对a先使用,再自减,这样y的值是11;之后a变成10; return 0; }

6.关系操作符
> >= < <= !=用于测试“不相等” ==用于测试“相等”

7.逻辑操作符
&& 逻辑与
|| 逻辑或
&& 逻辑与: 将两个表达式连接成一个。两个表达式必须都为 true,整个表达式才为 true

1&&3 --->1 1&&0 --->0

|| 逻辑或
将两个表达式连接成一个。必须有一个或两个表达式为 true,才能使整个表达式为 true。只要其中有一个为 true,那么另外一个就变得无关紧要

1||1 -->1 1||0 -->1

8.条件操作符
exp1 ? exp2 : exp3
如求两个数中最大值
if(a>b) return a; else return b;

换成条件表达式
(a>b)?a:b //判断(a>b)是否成立,如果成立返回a的值,否则返回b的值

9.逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
int a = 1; int b = 2; int c=(a=a*b, a=b+10, a, b=a+1); a=1*2=2, a=2+10=12,12,b=12+1=13 所以结果为13

    推荐阅读