1 操作符分类
操作符包括:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员。
2 算术操作符
加 减 乘 除 取模(取余)
(1)除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
(2)对于/操作符,如果两个操作数都是整数,执行整数除法。只要有一个浮点数,执行的就是浮点数除法。
(3)%操作符的两个操作数必须为整数,返回的是整除之后的余数。
3 移位操作符
<< 左移操作符 >>右移操作符
移位操作符的操作只能是整数
左移和右移的都是补码,但是打印出来的都是原码对应的十进制。(补码减一,除符号位 其它按位取反)
知识点:
原码反码补码
整数有3种二进制的表示形式(任何整数都可以表示出原码 反码 补码)
整数在内存中储存的是补码
正整数:原码 反码 补码 相同
负整数: 原码 反码 补码不同,要进行计算
移位操作符,正数不用管 ,负数记得补码变原码。
3.1 左移操作符
移位规则: 左边抛弃、右边补零(指对应二进制的左移和右移)
知识点: a的值还是3,并没有发生变化,只是一种运算。 a<<1只是展现a左移一位的效果,a的值 在没有赋值的情况下 并没有发生变化。
3.2 右移操作符
移位规则:
首先右移运算分两种:(到底是逻辑右移还是算数右移,取决于编译器。我们常见的编译器都是算术右移)
1.逻辑移位:左边用0填补,右边丢弃
2.算术移位:左边用原该值的符号位 填补,右边丢弃。
(注意,负数,回归原码是10000000000000000000000000000001,这个数是-1,不是2^32+1)
警告:
可以左移正数,可以右移正数,但是不可以左移负数 ,右移负数。例如:a<<-3.这是标准为定义的。
4 位操作符
注意:(正负数都可以,补码进行操作,打印的是原码)
对应的操作也是二进制位的操作(补码操作)(int 32位)
上图都是正数操作,以便方便叙述,所以前面的0在这里省略。
4.1 不创建临时变量,进行两个数交换
代码1展示:(有局限性,不能解决全部情况,因为int是有范围限制的,万一a和b这两个数非常大,a+b超过int的范围,那么就会出现错误)
1. #include <stdio.h> 2. int main() 3. { 4. int a = 2; 5. int b = 3; 6. printf("%d %d\n", a, b); 7. a = a + b; 8. b = a - b; 9. a = a - b; 10. printf("%d %d", a, b); 11. return 0; 12. }
代码2展示:
两个相同的数异或,是0;0和任何数异或,还是任何数。a^b^b = a
1. #include <stdio.h> 2. int main() 3. { 4. int a = 2; 5. int b = 3; 6. printf("%d %d\n", a, b); 7. a = a ^ b; 8. b = a ^ b;//a^b^b = a 9. a = a ^ b;//a^b^(原来的a) = 原来的b 10. printf("%d %d", a, b); 11. return 0; 12. }
5 赋值操作符
= 赋值操作符
a = b = x+1; 分析:x+1的值赋给b,的值赋给a,但是不提倡用(不清晰爽朗 不易与调试)
知识点:
左值:是可以放在等号左边,一般是一块空间
右值:是可以放在等号右边的,一般是一个值(a = 10)或者是一块空间的内容(a = 10 b = a)
复合赋值符:
别的都类似于上图所示