C语言——操作符详解(上)
C语言——操作符详解(上)
本节目录
算数操作符
移位操作符
位操作符
赋值操作符
复合赋值符
单目操作符
算数操作符
-
+
*
\
%
(%操作符左右两边的数必须都为整数)
移位操作符
>>
<<
例1:
例2:
注意1:
左移直接在空的地方补0 如例1
右移有两种情况:
1.逻辑位移 补0
2.算数位移 补1 如例2(一般都是这种情况)
注意2:
移位操作符,不要移动负数位,这是标准未定义。
如:num >> -1
//error
位操作符
&
(按位与)|
(按位或)^
(按位异或)
例3:按位与
例4:按位或
例5:按位异或
※重点 例6:异或的应用——交换两个值的内容
方法一:
int a,b,c;
c = a;
a = b;
b = c;
方法二:(!如果a,b很大可能会溢出)
int a,b;
a = a + b;
b = a - b;
a = a - b;
方法三:(异或法)
int a, b;
a = a^b;
b = a^b;
a = a^b;
!难点 例7:怎么求一个二进制位中1的个数
#include<stdio.h>
int CountOneBit(unsigned int n){//解决负数无法计算问题,这种运算运算的是补码
int count = 0;
while(n){//类比十进制中每位数的求法
if(n%2 == 1)
count++;
n/=2;
}
return count;
}
int main(){
int n = 0;
int num_1 = 0;
printf("请输入一个数:");
scanf("%d",&n);
num_1 = CountOneBit(n);
printf("%d的二进制序列中有%d个 1",n,num_1);
}
补充:
unsigned的作用:
unsigned就是将这个二进制数最高位的符号位变成计数位。下面我们举个例子帮大家理解一下
如果我们输入的是-1
-1%2 == -1
-1/2 = 0
这样输出的count为0
但是我们知道-1的补码是11111111111111111111111111111111
这样我们的代码就局限在正整数
如果加上unsigned 虽然我们输入的是-1 但是程序计算是是按照 unsigned int 的最大值,这样就避免了这个问题
更多位运算相关示例(我的GitHub仓库,对您帮助不妨给我点个star~)
赋值操作符
=
a = b = c
它的意义是将c的值赋给b,再将b的值赋给a。其实这样理解不够准确,其实应该这么写:a = (b = c)
先将c的值赋给b 然后将这个整体,即b的值赋给a
复合赋值符
+=
-=
*=
\=
%=
>>=
<<=
&=
|=
^=
单目操作符
例8:!的应用
应用!与flag来判断情况做出选择
if(flag){
flag为真进入循环;
}
if(!flag){
flag为假进入循环;
}
注意:
1.printf函数打印格式
格式 输出
%#p 0XCCCCCC
%p 00CCCCCCC
%x cccccc
%X CCCCCC
2.用sizeof判断类型的大小类型名必须加括号
int a = 0;
sizeof(a)=4
sizeof(int) = 4
sizeof a (√)
sizeof int (×)
3.用sizeof求数组长度
sizeof求数组大小 sizeof(arr)
sizeof求数组元素个数 sizeof(arr)/sizeof(arr[0])
切记!!!sizeof不能再函数内部求指针数组的大小
4.sizeof是在编译阶段完成的
int a = 10;
short s =3;
printf('%d\n",sizeof(s = a+4));
printf("%d\n",a);
printf("%d\n",s);
输出:2 10 3
赋值并不会将类型一同赋予左值
sizeof在编译阶段就已经运行结束了(sizeof 被 换成 2)
而s = a + 4要到生成可执行文件之后才会完成
编译(.c) -- 链接(.exe)
例9:小心细节问题。进入函数后 ch实际上变成了指针变量。
例10:按位取反的应用
若想完成一下操作:
15 00001111
将从右数第4位变成0 ,应该如何操作?
a = (1<<4-1) 00001000
b = ~(a) 11110111
b&15 00000111
所以可以这么写:
a &= (~(1<<4-1));
如何变回来呢?
00001000 1<<4-1
00000111 | (1<<4-1) 即可
长按二维码关注我,更多干货等着你!