vlambda博客
学习文章列表

C语言——操作符详解(上)

C语言——操作符详解(上)


本节目录
  • 算数操作符

  • 移位操作符

  • 位操作符

  • 赋值操作符

  • 复合赋值符

  • 单目操作符


算数操作符

-
+
*
\
%(%操作符左右两边的数必须都为整数)


移位操作符

>>
<<

例1:

例2:

C语言——操作符详解(上)

注意1:
左移直接在空的地方补0 如例1
右移有两种情况:
1.逻辑位移 补0
2.算数位移 补1 如例2(一般都是这种情况)
注意2:
移位操作符,不要移动负数位,这是标准未定义。
如:num >> -1 //error


位操作符

& (按位与)    
| (按位或)    
^(按位异或)

例3:按位与

C语言——操作符详解(上)

例4:按位或

C语言——操作符详解(上)

例5:按位异或

C语言——操作符详解(上)

※重点  例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) 即可



长按二维码关注我,更多干货等着你!