操作符:
算术操作符
+ - * / %
1:除了%操作符之外,其他几个操作符可以作用于整数和浮点数。
2:对于/操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数,执行的就是浮点除法。
3:%操作符的两个操作数必须为整数,返回的是整除之后的余数。
int a = 5/2; printf("%d\n", a); double b = 5 / 2.0; printf("%f\n", b);
2 2.500000
a进行的是两个整数相除,因此并不会的到小数,要想得到小数,只需要把除数或者被除数改为浮点数即可。
移位操作符
移位操作符(移动的是二进制位,他们的操作数必须是整数),(右移一位有除二的效果):
右移操作符>>:
1:算数右移(主要针对负数符号位这里会有所不同):二进制最右边丢弃,左边补原符号位
2:逻辑右移(不分正负数):右边丢弃,左边补零
左移操作符<<:
左边丢弃,右边补0
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
Int num=10; Num>>-1;//error
8位二进制数11001101分别右移一位
逻辑右移就是:[0]1100110
算术右移就是:[1]1100110
整数存储到内存的是补码:
1000000000000000000000000000000000001(-1的原码)
1111111111111111111111111111111111110(反码,符号位不变,其余位置将0变成1)
1111111111111111111111111111111111111(补码,末位置加1)
位操作符:
(他们的操作数必须是整数,同样是对二进制进行操作)
1:& 按位与 :两个数的二进制位同时为1,则该位是1,否则是0,如果有负数进行参与,则应先算出该负数的补码,整数并不参加此次运算,由于正数的补码反码原码是相同的;
2: |按位或 :两个数的二进制只要有一个为一,则该位为1
3:^按位异或(两个数的二进制位,相同为0,相异为1)
例题:不创建临时变量实现两个数的交换
方法一:(但这种方法只能用于比较小的整数值,,如果想实现非常大的整数进行交换,就可能会溢出,因此这种方法并不具有普遍性)
#include<stdio.h> int main() { int a = 3; int b = 5; a = a + b; b = a - b; a = a - b; printf("a=%d,b=%d\n", a, b); return 0; }
方法二:(这种方法并不会产生溢出现象,但是它的可读性和执行能力较差)
#include<stdio.h> int main() { int a = 3, b = 5; a = a ^ b; b = a ^ b; a = a ^ b; printf("%d\n", a); printf("%d\n", b); return 0; }
判断一个数的二进制中包含几个1:
#include<stdio.h> int main() { int num = 0; int count = 0; scanf_s("%d", &num); while (num) { if (num % 2 == 1) count++; num = num / 2; } printf("%d\n", count); return 0; }
-1 0
但这个代码是有问题的,如果我们输入的数字是复数的话,得到的值是0,显然不符合我们的规则。
按位与的方法:
#include<stdio.h> int main() { int num = 0; int count = 0; scanf_s("%d", &num); int i = 0; for (i = 0; i < 32; i++) { if (1 == ((num >> i) & 1))#不停的向右移动,1的二进制码始终是000000000000000000000001 count++; } printf("%d\n", count); return 0; }
-1 32
赋值操作符:
当我们不满意前面的某个变量时,可通过赋值运算符对该变量的值进行修改。
单个赋值:
举例:
int a = 100; a = 30; printf("%d", a);
30
连续赋值:
int a = 10, b = 23, x, y; y = x = a + b; printf("%d\n", y); printf("%d\n", x);
33 33
小tips:赋值运算符是一个等号,而比较运算符是两个等号。
复合赋值符:
+= -= *= /= %= >>= <<= &= |= ^=
这种操作符在一定程度上可以简化代码量
举例:
a=a+2; a+=2; a=a>>1; a>>=1;
这两种赋值的结果都是相通的,只是在形式上不太一样。
单目操作符:
!:逻辑反操作 (真变假,假变真)
-:负值
+:正值
& :取地址 (一般和指针配合使用)
sizeof :操作数的类型长度 (计算变量所占内存空间的大小,单位是字节)
sizeof(变量类型或变量名),后面如果是变量类型则括号不能省略,但如果是变量名括号可以省略。
~:对一个数的二进制按位取反
– :前置,后置–
++ :前置,后置++
*:间接访问操作符(解引用操作符)
(类型):强制类型转换
常见类型的字节大小:int:4个字节 char:1个字节 *p:4个字节 数组:数组元素个数×对应类型的大小