目录
一、算术操作符
难易程度:⭐
+ - * / %
1.注意事项:
1️⃣ 除了 % 操作符之外,其他的操作符可以用于整数和浮点数的计算。
2️⃣ 对于 / 操作符,如果两端的操作数都是整数,
执行整数除法,只要有浮点数,执行的是浮点数的除法。
3️⃣ % 操作符两端的操作数必须是整数,得到的值是整除之后的余数。
2.代码示例:
#include<stdio.h>
int main()
{
int a = 3 / 5;//结果:0
int b = 6 / 5;//结果:1
//double类型的整数运算小数点后面补6个0
double c = 6 / 5;//结果:1.000000
//操作数两端至少有一个浮点数,得到的结果才会是浮点数
double d = 6.0 / 5;//结果:1.200000
int e = 7 % 3;//结果:1
int f = 8 % 3;//结果:2
printf("a=%d\n", a);
printf("b=%d\n", b);
printf("c=%lf\n", c);
printf("d=%lf\n", d);
printf("e=%d\n", e);
printf("f=%d\n", f);
return 0;
}
二、移位操作符
难易程度:⭐⭐
<< 左移操作符
>> 右移操作符
1.左移操作符<<
移位规则:
左边舍弃,右边补0.
2.右移操作符>>
移位规则:右移分两种
1️⃣ 逻辑右移
右边舍弃,左边补0。
2️⃣ 算数右移
右边舍弃,左边补原符号位。
在内存中存二进制序列的时候,最高位如果放的是0,表示它是正数;如果是1,表示它是负数
警告:对于移位操作符,不要移动负数位,这个是标准未定义的
例如:
int a = 2;
a >> -1;//error
三、位操作符
难易程度:⭐⭐⭐
按位与(&)
按位或(|)
按位异或(^)
注:操作数必须是整数
比较的是操作数的二进制序列
1.按位与
2.按位或
3.按位异或
4.练习题
交换两个int变量的值,不定义第三个变量。如int a = 3; int b = 5;交换后,int a = 5; int b = 3;
#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;
}
代码分析:
四、赋值操作符
难易程度: ⭐
赋值操作符:=
复合赋值符:+=、-=、/=、%=、*=、<<=、>>=、&=、|=、^=
1.赋值操作符
赋值操作符可以让你在得到一个不满意的值的时候重新赋值。
int age = 32;
age = 18;//不满意就赋值
double num = 100.0;//使用赋值操作符赋值
//可以连续赋值
int a = 10;
int b = 20;
int c = 30;
a = b = c + 1;//连续赋值
注意 :连续赋值的方法不是很清晰,而且也不便于调试,所以不推荐。
2.复合赋值符
是将两个运算符拼凑在一起
int a = 10;
a = a + 10;
a += 10;//其他的复合赋值符用法相同
a >>= 3
注意:=是赋值的意思
==是判断相等的意思
五、单目操作符(只有一个操作数)
难易程度:⭐⭐
!、 -、 +、 &、 ~、 --、 ++、 *、 (类型)、 sizeof
1. !(逻辑反操作)
#include<stdio.h>
int main()
{
int a = 1;
//a为真打印hehe
if (a)
{
printf("hehe\n");
}
//a为假打印haha
if (!a)
{
printf("haha\n");
}
return 0;
}
2. -(负值)
#include<stdio.h>
int main()
{
int a = 1;
a = -a;//让a变成负数
printf("%d\n", a);//输出结果:-1
return 0;
}
3. sizeof(操作数的类型长度,以字节为准)
#include<stdio.h>
{
int a = 10;
char arr[10]={0};
//计算a所占空间的大小,单位是字节
//对于变量名的计算,可以省略括号
//如果是数据类型,就不可以省略括号
printf("%d\n",sizeof a);//结果:4
printf("%d\n",sizeof(int));//结果:4
//sizeof也可以用来计算数组的大小
printf("%d\n",sizeof(arr));//结果:10
return 0;
}
4. ++(后置++,前置++)
#include<stdio.h>
int main()
{
int a = 10;
int b = a++;//后置++,先使用再++
//先把10赋给b,a再自加1变成11
printf("b=%d\n", b);//结果:10
printf("a=%d\n", a);//结果:11
return 0;
}
#include<stdio.h>
int main()
{
int a = 10;
int b = ++a;//前置++,先++再使用
//a先自加1,变成11再赋给b
printf("%d\n", a);//结果:11
printf("%d\n", b);//结果:11
return 0;
}
5. --(后置--,前置--)
#include<stdio.h>
int main()
{
int a = 10;
int b = a--;//后置--,先使用,后--
//a先赋给b,再自减1
printf("a=%d\n", a);//结果:9
printf("b=%d\n", b);//结果:10
return 0;
}
#include<stdio.h>
int main()
{
int a = 10;
int b = --a;//前置--,先--,后使用
//a先自减1,再赋给b
printf("%d\n", a);//结果:9
printf("%d\n", b);//结果:9
return 0;
6. ~ (对一个数的二级制按位取反)
#include<stdio.h>
int main()
{
int a = -1;
//~按为取反
//把补码按位取反包括符号位
//11111111111111111111111111111111
//00000000000000000000000000000000
int b = ~a;
printf("%d\n", b);
return 0;//结果0
}
7. * (解引用操作符)、&(取地址)
注意:当 & 只有一个操作数的时候,是取地址操作符;有两个操作数的时候,是按位与操作符。
8. (类型)强制类型转换
#include<stdio.h>
int main()
{
int a = 3.14;//类型不统一
//从double转化到int可能会丢失数据
//可以用强制类型转换来解决
int a = (int)3.14;//把3.14强制转换成int类型的
return 0;
}
注意:()是阔数据类型的,而不是阔数值。