目录
操作符知识点思维导图展现:
操作符知识点笔记梳理,前面是比较常见的一些用法,后面遇到的一些相对特殊的需要一定理解消化,后续碰到感悟例题会持续记录。
常见操作符
算术操作符
+ - *(乘) / (整除) %(取余)
简单说下特性:/ 如果除数和被除数都是整数则都按整除处理,除数和被除数中有一个是小数,则才可以得到后面的小数位;% 即取余数 5%2=1,结果的正负取决于被余数,-5%2等于-1,但是5%-2不等于-1、%两边必须都是整数,不存在 5%3.0等
int main()
{
printf("%f\n",5.0/2);//2.500000
printf("%d\n",5/2);//2
printf("%f\n",5/2.0);//2.500000
printf("%f\n",5.0/2.0);//2.500000
//整除
double a = 5/2;
printf("%f\n", a);//2.0000000
printf("%f\n", 5 / 2);//0.000000
//默认整型存储但浮点型打印,因为二者的存储机制不一样,所以打印0.000000
printf("%d\n", -4 % 3);
//取余只和被余数有关
printf("%d\n", 4 % -3);
return 0;
}
赋值操作符
=和连续赋值
int a = 1;//赋值
int b = 3;
int c = 0;
c = b = a + 4;//连续赋值,从左至右依次赋值
复合赋值符
常见的:+= -= *= /= %=
比较少见的:>>= <<= &= |= ^=
简单说下用法:
int a = 4;
int b = 0;
a += 4;//a = 8
a = a + 4;//a = 12
b = a + 2;//a的值不变
这里可能会出问题的在第三个表达式,看起来简单,有时不经意间就可能犯错了
单目操作符
前置++ 后置++ 前置-- 后置--
规则:前置即先运算再用,后置则先用再运算
在这里我们只举++的例子,--同理:
int a = 10;
int b = a++;
int c = ++a;
printf("a的值为:%d\n", a);//12
printf("b的值为:%d\n", b);//10
printf("c的值为:%d\n", c);//12
关系操作符
> < = >= <= == !=
关系表达式返回的是0或1,0为假,1为真
如:5 > 7返回0 7>5返回1
出错的点:if条件判断容易把“==”写成“=”导致错误;连续比较,条件判断中写成“a<b<c”,对此我们一般用“a<b && b<c”
条件操作符
条件操作符也叫三目操作符
三目操作符:exp1 ? exp2 : exp3
exp1为真时,执行exp2;exp1为假时,执行exp3
int main()
{
int a = 10;
int b = 20;
int max = a > b ? a : b;//执行b
printf("%d\n", max);
return 0;
}
逻辑操作符
&(且) |(或) ! (反运算) && ||
在这里我们主要说明后三个
反运算即如果为 a 为false,则 !a 为true
int main()
{
int a = 10;//不打印
//int a = 0; 打印
if (!a)
{
printf("hello world\n");
}
//0为假,非0为真
return 0;
}
&&和||也是“且”和“或”的意思,只不过较前面两个特殊
&&:两边表达式有一个为假则停止判断,结果为假
||:两边表达式有一个为真则停止判断,结果为真
&&举例,大家可以尝试计算:
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
printf("i = %d\n", i);
//2 3 3 5
//1
a、b、c均大于0,所以表达式都正常计算,最后结果为真,所以i为1(真默认值)
||举例,与上相同:
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
printf("i = %d\n", i);
//2 2 3 4
//1
a大于0,则后面的表达式都不再计算,所以b、d不变,最后结果为真,所以i为1
后面的平常比较少见,但也容易犯错
逗号表达式
用“,”隔开,整个式子从左到右依次进行,整个式子的结果是表达式的最后一个结果
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b + 1);//最后一个赋值
printf("%d\n", c);//3
printf("%d\n", a);//12
&、|、^操作符
单独拿下来是因为这三个操作符都可以对一个数的二进制进行直接运算
&:二进制两个对应的位同时为1结果为1,其余则为0
|:二进制两个对应的位只要有一个为1结果为1,否则为0
^(异或):二进制两个对应的位相同则为0,不相同则为1
int main()
{
int a = 1;//00000001
int b = 15;//00001111
int c = a & b;
printf("%d\n", c);//1
return 0;
}
异或举例:
交换a与b的值,不创建中间变量
int main()
{
int a = 3;//00000011
int b = 5;//00000101
a = a ^ b;//00000110
b = a ^ b;//00000011
a = a ^ b;//00000101
printf("a=%d,b=%d\n", a, b);
return 0;
}
移位操作符
>> <<
二进制右移和左移
移位规则:
1.算术右移:右边丢弃,左边补原符号位()
2.逻辑右移:右边丢弃,左边补0
有符号数遵循1,无符号数遵循2
int a = 10;//00001010
//整体右移,10移除,前面补符号位00
printf("%d\n", a >> 2);//2
int b = -4;//11111111 11111111 11111111 11111100
printf("%d\n", b >> 2);//补符号位,结果为-1
int c = 3;//00000011
printf("%d\n", c << 2);//00001100 结果为12
最后再来一个小编程题
计算一个数二进制中有几个1
方法一:
//统计数字二进制有几个1
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
while (num)
{
if (num % 2 == 1)
//类似十进制转换二进制的过程,中间添加了计数
{
count++;
}
num = num / 2;
}
printf("该数字中有%d个1", num, count);
}
方法二:这个方法可以更好理解&和>>操作符
int main()
{
int num = 0;
//计数
int count = 0;
scanf("%d", &num);
int i = 0;
//int类型最多32位,防止溢出
for (i = 0; i < 32; i++)
{
//&1 == 00000000或者00000001
//右移后,num的值不变
if (1 == ((num >> i) & 1))
{
count++;
}
}
printf("该数字中有%d个1", count);
}
右移一定位数后相当于只比较最后一位
对于笔记整理的不足之处,希望大家能够帮忙指出和反馈,我会不断改善,感谢阅读!