C语言复习巩固(六) 操作符(上)

目录

 

算数操作符

 移位操作符

 位操作符

 赋值操作符

 复合赋值符

 单目操作符


算数操作符:

+     -      *     /     %

%  左右两边的数必须都为整数

 移位操作符:

>>     <<

 例1:b = 20;

例2:b = -4

注意1:

左移直接在空的地方补0 如例1

右移有两种情况:

1.逻辑位移 补0

2.算数位移 补1 如例2(一般都是这种情况)

注意2:

移位操作符,不要移动负数位,这是标准未定义。

如:num >> -1//error

 位操作符

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

 例3:按位与

 例4:按位或

 例5:按位异或

例6:异或的应用——交换两个值的内容

方法1:

int a,b,c;
c = a;
a = b;
b = c;

 方法2:(如果a,b很大可能会溢出)

int a,b;
a = a + b;
b = a - b;
a = a - b;

方法3(异或法):

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 的最大值,这样就避免了这个问题

更多位运算相关示例: https://github.com/hairrrrr/linux.ccode/tree/master/Bit/ClassCode/2020-1-7%EF%BC%888%EF%BC%89

 赋值操作符

=

a = b = c 

它的意义是将c的值赋给b,再将b的值赋给a。其实这样理解不够准确,其实应该这么写:

a = (b = c)

先将c的值赋给b 然后将这个整体,即b的值赋给a

 复合赋值符:

+=     -=    *=    \=    %=    >>=     <<=    &=   |=    ^=

 单目操作符:

 !   

 -       

=       

&(取地址)     

sizeof(操作数的类型长度)       

~ (对一个数的二进制位按位取反)                               

--      ++ (前置,后置)     

(解引用)     

(类型)(强制类型转换)

 例8:!的应用

应用!与flag来判断情况做出选择

if(flag){

     flag为真进入循环;

}

if(!flag){

     flag为假进入循环;

}

printf函数打印格式 

%#p       0XCCCCCC

%p         00CCCCCCC

%x         cccccc

%X        CCCCCC

1

int a = 0; 

sizeof(a)=4

sizeof(int) = 4

sizeof a    √

sizeof int   ×

2

sizeof求数组大小    sizeof(arr)

sizeof求数组元素个数  sizeof(arr)/sizeof(arr[0])

切记!!!sizeof不能再函数内部求指针数组的大小

3

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)

4  

小心细节问题。进入函数后 ch实际上变成了指针变量。

例9:~ 的应用 

若想完成一下操作:

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) 即可

发布了19 篇原创文章 · 获赞 88 · 访问量 3262

猜你喜欢

转载自blog.csdn.net/qq_44954010/article/details/103884758