1.算数操作符
+ - * / %
+ - *就是加减乘非常简单,/除法操作符在两个操作数都是整数时执行整数除法,只要有一个是浮点数就执行小数除法,%取模操作符两个操作数必须是整数,得到的结果是除法的余数,
2.移位操作符
<<左移操作符
>> 右移操作符
对于一个整数,正数在内存中存储是二进制,有源码,反码,补码三种形式,内存中以补码形式存储,对于正数来说,源码,反码,补码三种形式相同,正数的补码开头就是0,例如,int x =3;
x的源码,反码,补码都是00000000000000000000000000000011。
对于一个负数,三种二进制开头都是1,二进制源码就是转换成的二进制,反码就是将第一位不动,其他位1变成0.0变成1,补码就是在反码的基础上加一,例如int x=-3;x的源码是10000000000000000000000000000011,反码是11111111111111111111111111111100,补码是11111111111111111111111111111101.
对于左移位操作符a=a<<x就是将二进制补码向左移动x位,将有溢出的去掉,并将缺少的补上0
右移位操作符a=a>>x有两种情况取决于你的编译器(1)算术移位,将溢出的去掉,并补上该数字的本身正负号0或1填充(2)逻辑操作符,将溢出去掉,并补上1.
注意:对于右移操作符和左移操作符两个操作数必须是整数,移动的位数必须是正整数。
如下图
需要注意的是左移操作符和右移操作符不改变数据本身的值只是将其操作后赋值给b。
3.赋值操作符
单一赋值就是=进行赋值,例如:int a=0;还有复合赋值操作符,比如+= -= *= /= %= >>= <<= &= |= ^=他们就是先进行操作再进行赋值,例如,a+=2就是相当于a=a+2的效果。
4.位操作符
位操作符有&按位与,|按位或,^按位异或,~对一个数的二进制按位取反
&按位与就是将两个操作数的补码逐位进行对照,如果两个都是1则结果为1,出现0则为0,例如:
a=3&1,3的补码是00000000000000000000000000000011
1的补码是00000000000000000000000000000001
a的补码是00000000000000000000000000000001那么结果就是1.
|按位或就是将两个操作数的补码逐位进行对照,如果两个都是0则结果为0,出现1则为1,例如:
a=3|1,3的补码是00000000000000000000000000000011
1的补码是00000000000000000000000000000001
a的补码是00000000000000000000000000000011那么结果是3;
^按位异或就是将两个操作数的补码逐位进行对照,如果两个都是相同则结果为0,出现不同则为1,例如:
a=3^1,3的补码是00000000000000000000000000000011
1的补码是00000000000000000000000000000001
a的补码是00000000000000000000000000000010那么结果就是3
~对一个二进制进行按位取反,就是将0变成1,将1变成0,例如:a=3~
3的补码是00000000000000000000000000000011
3~的补码是11111111111111111111111111111100
那么a的源码就是10000000000000000000000000000011结果是-3
对于^以下的规律当我们3^3时结果是00000000000000000000000000000000那么结果就是0,我们就有以下的规律a^a=0;当我们计算1^2^3和1^3^2的结果是相同的都是0,那么^就存在结合律。那么我们就可以解决:不能创建临时变量(第三个变量),实现两个数的交换。例如下图
想要一个数字的补码的任意一个变成1我们就可以使用|的方法
例如我们想要3的补码的倒数第九个变成1
int main()
{
int a = 3;
a = a | (1 << 8);
//3的补码是00000000000000000000000000000011
//1<<9的补码00000000000000000000001000000000
//那么结果就是00000000000000000000001000000011结果是259
printf("%d", a);
return 0;
}
当我们想要一个数字任意一个补码变成由1变成0
例如我们想要3的倒数第二个变成0
int main()
{
int a = 3;
a = a & (~(a<< 1));
//3的补码是00000000000000000000000000000011
//~(a<< 1)的补码11111111111111111111111111111101
//那么结果就是00000000000000000000000000000001结果是1
printf("%d", a);
return 0;
}
5.单目操作符
! 逻辑反操作 逻辑反操作就是将真变成假,假变成真
例如下面代码
- 负值 负值将正的变成负的,可以将二进制补码首位变成1
+ 正值 正值将二进制补码首位变成0
& 取地址 取出一个变量的地址
* 间接访问操作符(解引用操作符)就是根据一个地址找到一个变量
sizeof 操作数的类型长度(以字节为单位)求字符串长度时将\0带上,sizeof不是函数可以不加括号,但是求数据类型所占空间大小时要加括号。
-- 前置、后置- 前置就是先--后使用,前置就是先使用后--
++ 前置、后置++ 前置就是先+=后使用,前置就是先使用后++
(类型) 强制类型转换就是当使用int a=2;
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
7.逻辑操作符
&&逻辑与
||逻辑或
逻辑与是都为真满足,逻辑或只要有一个是真就满足。
对于表达式1&&表达式2&&表达式3只要第一个为假就不执行后面
表达式1||表达式2||表达式3只要第一个为假就不执行后面了
例如下面
8.条件操作符
表达式1?表达式2:表达式3
如果表达式1为真就执行表达式2,为假就执行表达式3
例如
9.逗号表达式
结构是exp1,exp2……从左到右依次执行,最后一个表达式就是表达式的结果
10.下标引用、函数调用和结构成员
下标引用就是数组将引用内的内容格式是arr[2]的形式,操作数是arr 和 2,操作符是[],他们可以调换写成这样的形式,比如2[arr]
函数调用操作符是()操作数是函数名和函数传的值,最少有一个操作数就是函数名。
结构成员就是将结构体里面内容进行引用的形式对于直接引用有结构名.c成员和结构名指针->两种形式,例如下图
struct stu
{
int age[20];
};
int main()
{
struct stu a;
a.age = 20;
(&a)->age = 30;
return 0;
}