鸦领主 发表于 2020-11-28 21:58:21

C语言学习第七天 运算符

本帖最后由 鸦领主 于 2020-11-29 13:20 编辑

目录:
      一、运算符
         1.基本运算符
         2.比较运算符
         3.逻辑运算符
         4.位运算
         5.位运算的实际运用
         6.运算符的优先级






一、运算符

1.基本运算符
a)常量和变量的空间测量sizeof
不是运算时计算,而是编译时计算的
b)条件运算符号:
?:凡是if都可以转化为这个条件运算符表示(减少代码行数)
列:
    int i;                  int i;
    if (3 > 2)      等价于   i = 3 > 2 ? 4 : 3;/成立执行左边,不成立执行右边
      i = 4;
    else
      i = 3;

if( i != 0 )可以简写为if(i)
if(i==0)可以简写为if(!i)

=


c)自增自减:
++自增,--自减
i++等于i=i+1

i--等于i=i-1

d)自运算符号:+= ,-=,*=,/=,%=
i+=5等于i=i+5
i-=5等于i=i-5
i*=5等于i=i*5
i/=5等于i=i/5
i%=5等于i=i%5

2.比较运算符

a)基本条件运算符:”==“ !=“ < ”> “<= ”>=“
它们的补集关系:==和!=<和>=<和>=
列如:
i==10的补集i != 10
i>10的补集i<=10
i<的补集是i>=10

3.逻辑运算符

(复合多个条件判断的符号,结果真和假)
a) &&逻辑与:俩个条件都成立时,整体才成立
列如:if(a > 100 && a <= 200)只有a大于100与a小于等于200才会执行if里面的东西

b) ||逻辑或:俩个条件有一个成立时,整体就成立
列如:if(a < 0 || a>100 ) 当a小于0时条件成立或a大于100时条件也成立

c) !逻辑非:对一个集合取补集
列如:if(a==0)→if !(a==0)等价于if(a!=0)
if !(a>0 && a<=100)等价于→if(a<=0 || a>100)

4.位运算符号

a)<<左移运算符:i<<n(把i往左边移n位)结果是i*2的n次方
3<<4把二进制0000011(3)整体向左边移动4位0110000(48)


b)>>右移运算符:i>>n(把i往右边移n位)结果是i/2的n次方
50>>5 把二进制110010(50)整体向右边移动5位000001(1)
注意(右移)
对于有符号变量:
高位是1时,高位移动剩余位置填充1
高位是0时,高位移动剩余位置填充0
对于无符号变量:
统一填充为0



4.位运算

& (按位与):有0出0,无0出1(把俩个十进制数的二进制相与)
列如:
15&13=13         52&32=16
1 1 1 1               1 1 0 1 0 0
1 1 0 1 =1101      0 1 0 0 0 1=010000
=======================================
| (按位或):有1出1,无1出0(把俩个十进制数的二进制相或)
列如:                                                                                       
15&13=15         52&32=53
1 1 1 1               1 1 0 1 0 0
1 1 0 1 =1111      0 1 0 0 0 1=110101
======================================= ~ (按位取反):将一个数字的所有二进制0变成1,把1变成0

有符号时:-1变0,0变-1,1变-2......55变-56
无符号时:-1变0,0变4G-1,1变4G-2.......57变4G-58
列如;
00......0001→11.....1110
=======================================

^ (按位异或):相异为1,相同为0(把俩个十进制数的二进制异或)
列如:

15&13=2            52&32=37
1 1 1 1               1 1 0 1 0 0
1 1 0 1 =0010      0 1 0 0 0 1=100101
=======================================
5.位运算的实际运用

#define 定义一个标识符来表示一个常量。
用 #define 定义标识符的一般形式为:
#define标识符常量   //注意, 最后没有分号

”|“(或)将一些标识符组合在一起,已经有的标识符不会加在一起
#include<stdio.h>
#define zhong 4
#define hua 5
#define ren 8
#define min 15
int main()
{
    int i = hua | zhong;   //5|4=5hua和zhong组合在了一次   
    i = i | ren;   //5|8=13   然后在和ren组合                                 
    i = i | ren;   //13|8=13 又和ren组合,重复了并没有改变                                    
    return 0;                                       
}                                                         

hua和zhong先组合0101 | 0100
得出i=5=0101在和ren组合0101 | 1000
得出i=131101再一次和ren组合1101 | 1000
得出i=13=1101,已经有的标识符不会加在一起

“&”判断一些组合后的混合标识符,是否有指定的标识符,或者用来清理大部分位为0
    if (i & ren)                                           (i & min) ? printf("存在") : printf("不存在");//执行不存在
   
      printf("存在");//执行存在
    else
   
      printf("不存在");1101 i=13                     1101 i=13               1101 i=13
0100 zhong=4            0101 hua=5            1111 min=15
得出0100 代表存在      得出0101 代表存在   没有得出1111 代表不存在

“&~”用来删除混合标识符中的某一个标识符
i = i & ~ren; //i=5,删除了ren这个标识符
                                             
i = i & ~ren;//i=5,删除过后再次删除将不会做任何改变
00......1101                                     此时i是5   00......0101
11......0111得出    再次删除ren       ~ren是   11......0111得出
00.......0101 i=5                                              00......0101 i还是5

6.运算符的优先级:
(所有判断符号如果先算,结果必然是1,或0)

一级(左):()圆括号   []下标运算符   ->指向结构体成员运算符   . 结构体成员运算符

二级(右):!逻辑非运算符   ~按位取反运算符   ++自增运算符   --自减运算符   -符号运算符 (类型)类型转换运算符   *指针运算符   &地址与运算符sizeof长度运算符

三级(左):*乘法运算符   /除法运算符   %取余运算符

四级(左):+加法运算符   -减法运算符


五级(左):<<左移运算符    >>右移运算符

六级(左):< ,<=, >, >=, 关系运算符

七级(左):==等于运算符    !=不等于运算符


八级(左):&按位与运算符

九级(左):^按位异或运算符

十级(左):|按位或运算符

十一级(左):&&逻辑与运算符

十二级(左):||逻辑或运算符

十三级(右):?:条件运算符

十四级(右):+= ,-=, *= ,/= ,%=, =, >= ,<, <= ,&=, ^=, |=   赋值运算符

十五级(左):,逗号运算符(从左到右依次运算,最终结果采取最右边的结果)



补充:c语言容易出漏洞的地方是:
a) switch中忘记break;
b判断语句甲把赋值符号(=)当作判断符号(==)


页: [1]
查看完整版本: C语言学习第七天 运算符