一、运算符优先级

优先级【高到低】:
第一级:() 【】 -> .
圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】

第二级:! ~ ++ -- - (int..) * & sizeof
逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】

第三级:乘法运算符【*】、除法运算符【/】、取余运算符【%】
第四级:加法运算符【+】、减法运算符【-】

第五级:左移动运算符【<<】、右移动运算符【>>】
第六级:关系运算符【< > <= >= 】
第七级:等于运算符【==】、不等于运算符【!=】

第八级:按位与运算符【&】
第九级:按位异或运算符【^】
第十级:按位或运算符【|】
第十一级:逻辑与运算符【&&】
第十二级:逻辑或运算符【||】
第十三级:条件运算符【?:】
第十四级:赋值运算符【= += -= *= /= %= >>= <<.= &= |= ^=】
第十五级:逗号运算符【,】

二、排序相关知识点:

稳定排序与不稳定排序:

假设 Ri = Rj ,且排序前序列中 Ri 领先于 Rj ;

若在排序后的序列中 Ri 仍领先于 Rj ,则称排序方法是稳定的。

若在排序后的序列中 Rj 仍领先于 Ri ,则称排序方法是不稳定的。

例:序列   3    15     8     8     6     9

若排序后得   3     6      8     8     9    15         稳定的

若排序后得   3     6      8     8     9    15         不稳定的

内部排序: 指的是待排序记录存放在计算机随机存储器中进行的排序过程。

外部排序: 指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。

排序分类:

►插入排序

直接插入排序  希尔排序

►交换排序

冒泡排序  快速排序

►选择排序

简单选择排序  堆排序

►归并排序

►基数排序

1.插入排序:

#include <stdio.h>void InsertSort(int par_array[], int array_size)
{int i, j;int temp;for (i = 1; i < array_size; i++)// 从第二个开始 一个循环中 新加入的数去与前面的排好序的数比较 比前一个小 就不断往前挪 相等或者大于了 那就结束了(稳定{temp = par_array[i];for (j = i - 1; j >= 0; j--){if (temp < par_array[j]){par_array[j + 1] = par_array[j];}else{break;}}par_array[j + 1] = temp;//temp向后挪一个  即加入后面的新元素}
}int main()
{int i = 0;int a[] = {3, 5, 2, 1, 9, 0, 6, 4, 7, 8};int length = sizeof(a) / sizeof(a[0]);InsertSort(a, length);for (i = 0; i < length; i++){printf("%d ", a[i]);}printf("\n");return 0;
}

2.希尔排序

#include <stdio.h>void ShellSort(int array[], int length)
{int i, j;int h;int temp;for (h = length / 2; h > 0; h = h / 2)//对输入的数组大小 取半(取半后的大小就是步长 以此步长进行两个两个数的比较) 直到最后为0为止{for (i = h; i < length; i++){temp = array[i];for (j = i - h; j >= 0; j -=h)//这里j 因为 i++ 所以j 也会++ 步长就是上面计算的{if (temp < array[j]){array[j + h] = array[j];}else{break;}}array[j + h] = temp;}}
}int main()
{int i = 0;int a[] = {0, 5, 2, 4, 3, 1, 7, 6, 8, 9};int length = sizeof (a) / sizeof(a[0]);ShellSort(a, length);for (i = 0; i < length; i++){printf("%d ", a[i]);}printf("\n");return 0;}

3.冒泡排序

大家都会就不列了

4.快速排序

#include "stdio.h"
void find_frst(int *s,int left,int right)
{int i=left,j=right,temp;  //(1)初始化i、j    if(left>=right) return ;temp=s[i];                //(2)以第一个数组为比较值,保存到temp中 while(i<j){    while(j>i&&s[j]>=temp)  //(3)j--,找小值 j--;s[i]= s[j];             //保存小值,到s[i]上 while(i<j&&s[i]<=temp)  //(4)i++,找大值 i++;s[j--]=s[i];            //保存大值 到s[j]上 }s[i]=temp;             //(5)将比较值放在s[i]上 /*(6)拆分成两个数组 s[0,i-1]、s[i+1,n-1]又开始排序 */find_frst(s,left,i-1);         //左find_frst(s,i+1,right);        //右
}
int main()
{int i=0,s[100],n;scanf("%d",&n);        //输入数组长度for(i=0;i<n;i++)scanf("%d",&s[i]);    find_frst(s,0,n-1);  for(i=0;i<n;i++)printf("%d ",s[i]);      //打印printf("\n");
}

5.简单选择排序

 #include <stdio.h>void SelectSort(int *a, int n)
{int i, j;int temp = 0;int flag = 0;for (i = 0; i < n - 1; i++){temp = a[i];flag = i;for (j = i + 1; j < n; j++){if (a[j] < temp){temp = a[j];flag = j;}}if (flag != i){a[flag] = a[i];a[i] = temp;}}
}int main()
{int i = 0;int a[] = {5, 4, 3, 6, 1, 9, 7, 0, 2, 8};int length = sizeof(a) / sizeof(a[0]);SelectSort(a, length);for (i = 0; i < length; i++){printf("%d ", a[i]);}printf("\n");return 0;
}

6.后面慢慢加上来

3.三次握手四次挥手

1. 序列号seq

占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生,给字节编上序号后,就给每一个报文段指派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号。

2. 确认号ack

占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此挡墙报文段最后一个字节的编号+1即是确认号。

3. 确认ACK

占1个比特位,仅当ACK=1,确认号字段才有效。ACK=0,确认号无效。

4. 同步SYN

连接建立时用于同步序号。当SYN=1,ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使用SYN=1,ACK=1.因此,SYN=1表示这是一个连接请求,或连接接收报文,SYN这个标志位只有在TCP建立连接才会被置为1,握手完成后SYN标志位被置为0.

5. 终止FIN

用来释放一个

TCP三次握手以及四次挥手的过程

三次握手的过程

step1:第一次握手

建立连接时,客户端发送SYN包到服务器,其中包含客户端的初始序号seq=x,并进入SYN_SENT状态,等待服务器确认。(其中,SYN=1,ACK=0,表示这是一个TCP连接请求数据报文;序号seq=x,表明传输数据时的第一个数据字节的序号是x)。

step2:第二次握手

服务器收到请求后,必须确认客户的数据包。同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态。(其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含服务端的初始序号seq(服务器)=y,以及服务器对客户端初始序号的确认号ack(服务器)=seq(客户端)+1=x+1)。

step3:第三次握手

客户端收到服务器的SYN+ACK包,向服务器发送一个序列号(seq=x+1),确认号为ack(客户端)=y+1,此包发送完毕,客户端和服务器进入ESTAB_LISHED(TCP连接成功)状态,完成三次握手。

未连接队列

在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包时,删除该条目,服务器进入ESTAB_LISHED状态。

常见面试题:

1.为什么需要三次握手,两次不可以吗?或者四次、五次可以吗? 
我们来分析一种特殊情况,假设客户端请求建立连接,发给服务器SYN包等待服务器确认,服务器收到确认后,如果是两次握手,假设服务器给客户端在第二次握手时发送数据,数据从服务器发出,服务器认为连接已经建立,但在发送数据的过程中数据丢失,客户端认为连接没有建立,会进行重传。假设每次发送的数据一直在丢失,客户端一直SYN,服务器就会产生多个无效连接,占用资源,这个时候服务器可能会挂掉。这个现象就是我们听过的“SYN的洪水攻击”。 
总结:第三次握手是为了防止:如果客户端迟迟没有收到服务器返回确认报文,这时会放弃连接,重新启动一条连接请求,但问题是:服务器不知道客户端没有收到,所以他会收到两个连接,浪费连接开销。如果每次都是这样,就会浪费多个连接开销。

四次挥手过程(关闭客户端到服务器的连接)

step1:第一次挥手

首先,客户端发送一个FIN,用来关闭客户端到服务器的数据传送,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u。

step2:第二次挥手

服务器收到这个FIN,它发送一个ACK,确认ack为收到的序号加一。

step3:第三次挥手

关闭服务器到客户端的连接,发送一个FIN给客户端。

step4:第四次挥手

客户端收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加一。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

客户端发送FIN后,进入终止等待状态,服务器收到客户端连接释放报文段后,就立即给客户端发送确认,服务器就进入CLOSE_WAIT状态,此时TCP服务器进程就通知高层应用进程,因而从客户端到服务器的连接就释放了。此时是“半关闭状态”,即客户端不可以发送给服务器,服务器可以发送给客户端。 
此时,如果服务器没有数据报发送给客户端,其应用程序就通知TCP释放连接,然后发送给客户端连接释放数据报,并等待确认。客户端发送确认后,进入TIME_WAIT状态,但是此时TCP连接还没有释放,然后经过等待计时器设置的2MSL后,才进入到CLOSE状态。

2.为什么需要2MSL时间? 
首先,MSL即Maximum Segment Lifetime,就是最大报文生存时间,是任何报文在网络上的存在的最长时间,超过这个时间报文将被丢弃。《TCP/IP详解》中是这样描述的:MSL是任何报文段被丢弃前在网络内的最长时间。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒、1分钟、2分钟等。

TCP的TIME_WAIT需要等待2MSL,当TCP的一端发起主动关闭,三次挥手完成后发送第四次挥手的ACK包后就进入这个状态,等待2MSL时间主要目的是:防止最后一个ACK包对方没有收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可以继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

总结: 
(1)为了保证客户端发送的最后一个ACK报文段能够到达服务器。即最后一个确认报文可能丢失,服务器会超时重传,然后客户端再一次确认,同时启动2MSL计时器。如果没有等待时间,发送完确认报文段就立即释放连接的话,服务器就无法重传,因此也就收不到确认,就无法按步骤进入CLOSE状态,即必须收到确认才能close。 
(2)防止已经失效的连接请求报文出现在连接中。经过2MSL,在这个连续持续的时间内,产生的所有报文段就可以都从网络消失。

8-15主要复习 1.运算符优先级整体记忆 2.排序算法相关推荐

  1. 关于C语言运算符优先级的记忆技巧是什么?

    关于C语言运算符优先级的记忆技巧是什么? (1)先(括号)内层,后(括号)外层. (2)先函数,后运算. (3)先算术,后关系,再逻辑. (4)先乘除,后加减. (5)先左,后右. (6)搞不清,加括 ...

  2. C 语言运算符优先级(记忆口诀)

    优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右   () 圆括号 (表达式)/函数名(形参表)   . 成员选择(对象) 对象.成员名   -& ...

  3. C语言运算符优先级以及记忆方式

    C语言运算符优先级 C语言中运算符的优先级从高到低如下: 一元运算符:! ++ – +(正数)-(负数)& (取地址)*(指针值) 乘除模运算符:* / % 加减运算符:+ - 移位运算符:& ...

  4. 运算符优先级--辅助记忆

    辅助记忆口诀是根据网上众多口诀自己缩减优化出来的,每个大项里面没有细分,个人感觉太多反而不利于记忆,就这么地吧! 成员领航, 单目随后: 乘除加减, 移五关六: 等于不等 都在七, 位于异或 分天下: ...

  5. Java/C语言/C++/Python/PHP运算符优先级

    Java 运算符优先级 运算符 优先级 postfix expr++ expr-- unary ++expr --expr +expr -expr ~ ! multiplicative * / % a ...

  6. C语言运算符优先级 复习小妙招欸嘿

    C语言运算符优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成员选择(对象) ...

  7. C语言运算符优先级 之 快速记忆6,[快速记忆]C语言/php的运算符优先级(结合性)...

    author: selfimpr blog: http://blog.csdn.net/lgg201 mail: lgg860911@yahoo.com.cn 阅读, 看到书中对优先级记忆的精彩讲解, ...

  8. 运算符优先级记忆口诀及列表(转)

    C语言运算符优先级和口诀 一共有十五个优先级: 同一优先级的运算符,运算次序由结合方向所决定 1   ()  []  .  ->        (括号,成员排第一) 2   !  ~   -(负 ...

  9. C语言运算符优先级-----从没像现在这样深刻体会

    没做C/C++具体开发之前,从没像现在这样体会到运算符优先级的重要性,粘一个备忘,方便自己查. 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 ...

最新文章

  1. 泥瓦匠进阶:连接池原理设计并不难
  2. C语言博客作业03--函数
  3. 常用 IO 模型图解介绍
  4. 三、PHP框架Laravel学习笔记——路由参数、重定向、视图
  5. python回车键绑定按钮_python tkinter 绑定回车键
  6. 工作流性能优化(敢问activiti有扩展性?)(3)
  7. anaconda-虚拟环境的控制-新建-切换-删除
  8. 奥斯卡公布最佳动画长片初选名单 《哪吒》等32部动画入选
  9. ffmpeg 从内存中读取数据(或将数据输出到内存)
  10. java怎么反编译_java如何进行反编译
  11. pdfobject.js和pdf.js的详解
  12. 轩辕剑【超越XISE菜刀的shell管理工具】
  13. 基于VRML的虚拟校园漫游系统
  14. US Domain Center 建站神器
  15. 4针串口线接法图_com串口线接法
  16. python整数转换成英文表示
  17. Plotting data
  18. 使用 Learner Lab 建立 WordPress 网站 (EC2)
  19. 不会吧,最近很火的拍一拍你竟然还不知道?
  20. 腾讯微博开放平台授权教程(1)

热门文章

  1. 简述python中怎样导入模块_12 python中模块和包如何导入
  2. 在Qt在GUI程序里显示控制台界面
  3. 互动整合营销_营销成本日益升高,整合营销到底有多重要
  4. 太原理工软件学院c语言2020,太原理工软件工程C语言实验报告 数组.doc
  5. linux5.8不能上网,Ubuntu 8.04不能上网的问题的解决方法
  6. 矩阵一维卷积c++_深度神经网络卷积层计算加速与优化
  7. django html直接调用的方法,如何在Django中使用AJAX从html正确调用函数/url?
  8. python双循环zip_Python如何同时进行两个循环
  9. 为什么你应该开始习惯使用 pathlib
  10. linux下直接使用base64就可转换图片为二进制