学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

670

积分

1

好友

36

主题
发表于 2020-11-28 21:58:21 | 查看: 6758| 回复: 0
本帖最后由 鸦领主 于 2020-11-29 13:20 编辑

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






  一、运算符


1.基本运算符
a)常量和变量的空间测量sizeof
不是运算时计算,而是编译时计算的
b)条件运算符号:
?:凡是if都可以转化为这个条件运算符表示(减少代码行数)

列:
[pre]    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)
[/pre]

C语言学习第七天 运算符

C语言学习第七天 运算符
=

C语言学习第七天 运算符

C语言学习第七天 运算符



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.逻辑运算符

(复合多个条件判断的符号,结果真[1]和假[0])
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=5  hua和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.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-11-23 17:34 , Processed in 0.174601 second(s), 41 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表