一、此次学习小结
1.操作符
1.1算术操作符
需要注意除法,int型的除法是不能的得到小数的。计算时会把小数部分抹去。
1.2移位操作符
>>右移
<<左移
注意:只能对二进制的数进行移位操作运算
首先我们要了解二进制存储的一些知识。
00000000000000000000000000000001 -- 1
10000000000000000000000000000001 -- -1
二进制的开头一位是符号位,1是负数,0是正数
00000000000000000000000000000001 原码
00000000000000000000000000000001 反码
00000000000000000000000000000001 补码
正数的原码和反码和补码是相同的
10000000000000000000000000000001 原码
11111111111111111111111111111110 反码(原码的符号位不变,其他位取反)
11111111111111111111111111111111 补码(反码+1)
int a = 4;
a<<1;
左移,左边丢弃,右边补0(相当于*2)
a>>1;
右移,有两种方式
1逻辑右移 右边丢弃,左边补0
2算术右移 右边丢弃,左边补原符号位
一般采用算术右移
注意:不能移动负数
2.位操作符
& 按位与
| 按位或
^ 按位异或
注意:位操作符只能运算整数
int a = 5;
int b = 3;
int c = a&b;
00000000000000000000000000000101 5
00000000000000000000000000000011 3
00000000000000000000000000000001 1
写出二进制位,按照上表写就是了。
有一个面试题:
不创建临时变量,交换两个变量的值
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
//可以用加法
a = a+b;
b = a-b;
a = a-b;
printf("%d %d\n",a,b)
return 0;
}
这种有一个缺陷,当数字很大时,可能会截断
第二种是使用位操作符
位操作符支持交换律
3^3 ==0
5^3^3 ==5
5^5^3 ==3
这样就实现了交换
求二进制位中1的个数
num & (1 << i)
3.赋值操作符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
主要是使代码更加简洁
4.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
主要注意sizeof它是一个单目操作符
因此 sizeof 10 和 sizeof(10)是一样的
还有++和--
a++ a-- 是先对a使用再加1或-1
--a ++a 先加1,在使用a
5.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注意不要将判断的==写成=
因此建议if(11==a)这样写
6.逻辑操作符
&& 逻辑与
|| 逻辑或
区分
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
//一道有意思的题
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
&&中,当有一个为假,那就不用判断后面了,返回0
||中,当有一个为真,那就直接返回1了
二、此次学习收货
感受:对于操作符的认识又增加了不少,了解得越多发现知道的越少