今天分享一个自己刚整理完的C语言操作符的知识点
C语言基本操作符分为以下几类:
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
算术操作符
+ - * / %
1.除"%“外其他几个操作符均可用于整数和浮点数。
2.对于”/"来说,计算的两个数为整数则执行整数除法,若含有浮点数,则执行浮点数除法。
实例演示:
double a = 4.5;
int b = 3;
int c = 5;
printf("%d\n",c%b);
printf("%.3lf\n",a/c);
printf("%d\n",c/b);
结果为2;0.900;1
移位操作符
<<左移操作符 >>右移操作符
例子:有符号数
逻辑右移1位:1000 0001 -> 0100 0000 依次右移,最低位移出,最高位补0。(逻辑左移和他一样的方法)
算术右移1位:1000 0001 -> 1100 0000 依次右移,最低位移出,最高位补符号位的数字1。
算术左移1位:1000 0001 -> 1000 0010 依次左移,最高位符号位保持不变,最低位补0。
注:移位操作符右边的数字不能为负数!
位操作符
& 按位与
| 按位或
^ 按位异或
注:他们的操作数必须是整数
&:就是先转化为二进制数进行 & 操作,有0则为0,全1为1
| :就是先转化为二进制数进行 | 操作,有1则为1,全0为0
^:就是先转化为二进制数进行 ^ 操作,相同为0,不同为1
int num1 = 1;
int num2 = 2;
printf("%d\n",num1 & num2);
printf("%d\n",num1 | num2);
printf("%d\n",num1 ^ num2);
结果为 0;3;3
两个比较经典的 ^ 操作符使用实例:
1.不允许建立临时变量,完成两个数的交换。
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}
2.求一个整数存储在内存中的二进制中1的个数
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
这个解法可能一般是想不到的,但是这样做就很巧,因为一个数他如果不为0,那么他的二进制序列里一定含有1,这样就只需要,用他和自身-1的&值是否为0来判断,这样做是一个目的那就是每次都消掉二进制序列里最右边的1,每消掉一个count就++,这样循环几次后结果为0,不满足条件退出循环后的count结果则是二进制序列中1的个数。
赋值操作符
int a = 10;
int b = 20;
上面的 “=” 就是赋值操作符,可千万不要理解为等于的意思
还有一系列的复合赋值符:
+= -= *= /= %= >>= <<= &= |= ^=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置,后置 --
++ 前置,后置++
* 间接访问操作符(解引用操作符)
() 强制类型转换
操作实例:
#include<stdio.h>
int main()
{
int a = -10;
int b = 20;
int *ptr = NULL;
printf("%d\n", !5);
printf("%d\n",!0);
a = -a;
printf("%d\n", a);
ptr = &a;
printf("%d\n",*(ptr));
double d = (double)b;
printf("%.2lf\n",d);
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(ptr));
int c = b++;
printf("%d %d\n",c,b);
return 0;
}
运行结果如下图
1.&是获取变量a在内存中的地址。
2.*(ptr)是对指针进行解引用,获取其所存的值。
3.强制类型转换,有一点就是大范围向小范围转换时精度会损失。
4.不管什么类型的指针永远都是4个字节。
5.拿上面的代码来说不管前置还是后置++,b的值最终都是21,b都会+1,
但是对于c的值来说如果是++b的话,c的值就是21,因为他会先将b++再
赋给c,但是是b++的话,c的值就是20,因为他会先把b的值赋给c,再将
b的值++。
关系操作符
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 不等于
== 等于
关系运算符都很简单就没什么可讲的了,但有一点需要注意就是一定要把赋值符 “ = ” 和 关系操作符 “ == ” 区分开,不要混为一谈。
逻辑操作符
&& 按位与
|| 按位或
这里要区分开 “&&” 和 “ & ” ,“ || ” 和 “ | ”
举个例子:
&&:计算原则是只要有一边为false则结果为false,两边全为true则结果为true。
1&&2 -> 在计算时首先将1和2转化为Boolean型,非0的数,则为1(true),
0则为0(false),所以转化后为 true&&true -> true ->1。
1&2 -> 在计算时首先将1和2转化为二进制数,然后按位进行与操作,有0则为0
全1则为1,转化后为 01^10 -> 00 ->0。
||:计算原则为操作符两边有1则为1,全0为0。
这两个结果是不相同的,虽然中间的某些步骤是一样的,所以在遇到此类问题时一定要细心!
区别:
&&和||是短路运算符,
&和|是非短路运算符;
&&和||运算符第一个表达式不成立的话,后面的表达式不运算,直接返回。而&和|对所有表达式都得判断.
条件操作符
exp1 ? exp2 : exp3
这是一个三目运算符,算是挺实用的一个,他的运算规则是先判断exp1的条件是否为真
为真的话则执行exp2,为假则执行exp3,他和一个if条件语句等价。
逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行。
整个表达式的结果是最后一个表达式的结果 。
这个表达式可能见到的少一些,但是如果遇到的话要知道他怎么算的。
举个例子:
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a>b, a = b + 10, a, b = a + 1);
printf("%d",c);
return 0;
}
结果为13,因为执行到最后一条语句的时候,a已经等于12了,然后再执行b=a+1,所以b=13。