上次我们讲了算术操作符
加减乘除取模
除号
如果你想得到整数,那么两边必须是整数,如果你想得到浮点数,那么你的操作数的两端必须有一个是浮点数
而取模% 两边必须是整数,返回的是整除后的余数
然后我们还讲了左移和右移操作符
箭头左那就是左移
箭头右那就是右移
左移操作符规则很简单
左边抛弃,右边补0
右移操作符规则
右移操作符有两种运算
算术移位和逻辑移位
逻辑移位
左边补0,右边丢弃
算术移位
左边补原符号位,右边丢弃
接下来我们讲位操作符(只能用于整数)
位操作符有
按位与&
按位或 |
按位异或 ^
我们先来讲按位与的计算规则
假设-5和3相与
按位与,与的是他们的补码, 与的规则是两个都为真,才输出真(1),否则输出假(0)
-3的补码
0000 0000 0000 0000 0000 0000 0000 0011
-5的补码的计算过程
100000000000000000000000000000000101(原码)
111111111111111111111111111111111010 (反码)
111111111111111111111111111111111011 (补码)
-3的补码
0000 0000 0000 0000 0000 0000 0000 0011
-5的补码
111111111111111111111111111111111011 (补码)
000000000000000000000000000000000011(两个相与算出的补码)
我们用%d打印。%d打印的是原码,所以我们要把补码换算成原码
因为他的最高位是0所以正数,正数的原反补都相同 所以
000000000000000000000000000000000011(这个就是他的原码)
打印出来就是3
#include<stdio.h>
int main()
{int c=-5&3;printf("%d\n",c);return 0;
}
接下来讲或
两个数之中有1就为真,两个都为假才为假
二进制位中有1就为1,两个为0才为0
再用-5和3举例
-3的补码
0000 0000 0000 0000 0000 0000 0000 0011
-5的补码
111111111111111111111111111111111011 (补码)
两个向或
111111111111111111111111111111111011 (补码)
因为最高位是1,所以是负数,补码要进行换算才能得到原码
111111111111111111111111111111111010 (反码)
100000000000000000000000000000000101 (原码)
得到的值是-5
#include<stdio.h>
int main()
{int c=-5|3;printf("%d\n",c);return 0;
}
异或
异或的规则 相同为0 相异为1
再用-5和3举例
-3的补码
0000 0000 0000 0000 0000 0000 0000 0011
-5的补码
111111111111111111111111111111111011 (补码)
两个异或
111111111111111111111111111111111000(补码)
111111111111111111111111111111110111 (反码)
100000000000000000000000000000001000 (原码)
得到的是-8
#include<stdio.h>
int main()
{int c=-5^3;printf("%d\n",c);return 0;
}
一道变态的笔试题
不能创建第3个变量,实现两个数的交换
要想解决这个问题,我们先要看两个东西
3^3=0;
011
011
相异或等于0
0^5 =5
000
101
101
然后再看一个东西
3^3^5=5
3^5^3=5;
011
101
110
011
101
还是得到5
说明了相异或具有交换律
#include<stdio.h>
int main()
{int a = 3;int b = 5;printf("交换前%d %d\n", a, b);a = a ^ b; //a = 3 ^ 5;b = a ^ b; //b = 3 ^ 5 ^ 5;a = a ^ b;//a=3^5^3printf("交换后%d %d\n",a,b);return 0;
}
接下来我们赋值操作符
创建一个变量同时给他一个值,这就叫做初始化
赋值就是你初始化的值,你不满足,你又给他来了一个值就叫赋值
我们的赋值操作符还可以连续使用、
但是不建议这样写,因为你调试一下就过去了,你无法看到他们单步的样子,而且可读性不好
#include<stdio.h>
int main()
{int a = 16;int b = 20;a = b = a + b;printf("%d", a);//从右向左算,a+b先赋值给b,再赋值给a就是36了return 0;
}
我们还有复合操作符
单目操作符
单目操作符:只有1个操作数
a+b,双目操作符,操作符 有两个操作数,
!逻辑反操作
我们C语言是怎么判断真假的 0为假 非0为真
#include<stdio.h>
int main()
{int a = +16;//正号表示他是正数int b = +20;return 0;
}
正号放了什么都不干
#include<stdio.h>
int main()
{int a= -10;int b = +a;printf("%d\n", a);printf("%d\n", b);return 0;
}
#include<stdio.h>
int main()
{int a= -10;int b = -a;printf("%d\n", a);printf("%d\n", b);return 0;
}
sizeo是一个操作符也叫运算符
计算的是类型和变量所占内存中间的大小
计算类型所创建的变量占据空间的大小单位是字节
#include<stdio.h>
int main()
{int a= -10;printf("%d\n", sizeof(a));//计算的是a所占内存的大小return 0;
}
如果括号里面放数组
计算的是整个数组的大小
#include<stdio.h>
int main()
{int arr[5];printf("%d\n", sizeof(arr));//计算的是a所占内存的大小return 0;
}