1、函数宏定义时记得加括号,不加括号就是简单的文本替换,一般使用
#define f(a,b) ((a)+(b)),题目中不带括号,文本替换如下:
#define f(a,b) a+b
#define g(a,b) ab
2f(3,g(4,5))
g ( 4 , 5 ) → 4 ∗ 5 g(4,5)→4 * 5 g(4,5)→4∗5
f ( 3 , g ( 4 , 5 ) ) → 3 + 4 ∗ 5 f(3,g(4,5))→3+4 * 5 f(3,g(4,5))→3+4∗5
2 ∗ f ( 3 , g ( 4 , 5 ) ) → 2 ∗ 3 + 4 ∗ 5 2 * f(3,g(4,5))→2 * 3+4 * 5 2∗f(3,g(4,5))→2∗3+4∗5
2 ∗ 3 + 4 ∗ 5 = 26 2 * 3+4 * 5 = 26 2∗3+4∗5=26
2、写出伪代码,实现进程调度,使所有进程(P)可以顺利执行完毕。
程序中参数如下:
P - 进程的集合;
Mp - 进程p的最大的请求资源;
Cp - 进程p当前被分配的资源;
A - 当前可用的资源。
while(n > 0){ // n表示进程数目
int i = 0; // 当前进程号
while(i < n) {
if(Cp + A >= Mp){
进程执行;
A += Cp; //释放资源
n--; //进程运行结束,进程集合数目减一
}
i++; //运行下一个进程
}
若n未减小,则发生死锁;
}
如果涉及到进程调度,参考文献:操作系统进程调度模拟算法实现(C语言版)
3、 数字签名技术是将摘要用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要,然后用Hash函数对收到的原文产生一个摘要,与解密的摘要对比,如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则,就是被修改过,不是原信息。同时,也证明发送者发送了信息,防止了发送者的抵赖。
实现数字签名的主要技术是非对称密钥加密技术。
但是,数字签名并不能保证信息在传输过程中不被截获。
参考链接:数字签名-百度百科
4、
5、IP地址与子网掩码与运算的结果为该网络的网络号,因为他们在同一个子网,因此网络号也必然相同
6、
SMTP(应用层):简单邮件传输协议,是 email 之间传输时使用的协议,传输到终端的时候会采用 POP3 协议。
TCP\UDP(传输层):前一个面向连接,后一个面向无连接的协议。
DNS(应用层):域名解析,将域名转化为ip地址。
ARP(网络层或者数据链路层):地址解析,将 IP 地址转化为相应的 MAC 物理地址。
7、每一个网卡的 MAC 地址是写死的,全球唯一的一个。
8、在Linux中查看ARP缓存记录的命令是:
另外 Linux 常用的命令:27个常用的 Linux 命令
9、LRU(最近最少使用)该算法实现中最常用的是链表这个数据结构,将即将插入存储块的页面P与存储块中页面比较,如果存储块中已经存在页面P,则将链表中的页面P置于表头,不然缺页次数+1,如果这时链表长度达到目标值(存储块满),则去掉链尾的页面(也是最近最少使用的页面),并将页面P插入链表头。
例如存储块长度为3的时候,页面访问顺序为4, 3, 2, 1, 3, 5, 4, 3, 2, 1, 5
访问 | 链表 | 缺页+ |
---|---|---|
4 | 4 | 1 |
3 | 34 | 1 |
2 | 234 | 1 |
1 | 123 | 1 |
3(命中) | 312 | 0 |
5 | 531 | 1 |
4 | 453 | 1 |
3(命中) | 345 | 0 |
2 | 234 | 1 |
1 | 123 | 1 |
5 | 512 | 1 |
命中:即缓存数据被访问,所以当存储块为3时候,最后统计缺页次数为9次。
10、
进程其他知识点:在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
参考文献:进程 (一段程序的执行过程)- 百度百科
11、数据库第三范式:第三范式 (Third Normal Form,3rd NF) 就是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系(传递依赖关系)。
参考文献:三大范式(小白视角,一看就懂)
12、3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次 DES 加密算法。由于计算机运算能力的增强,原版 DES 密码的密钥长度变得容易被暴力破解;3DES 即是设计用来提供一种相对简单的方法,即通过增加 DES 的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。 而 DES 是对称加密算法,故而 3DES 也是对称加密算法。
13、以下语句编译不通过:
if (x=y) && (x!=0) x+= y; //少了括号
if((x=y)&&(x!=0)) x+= y; //正确情况
注意:这里和 x = y 还是 x == y 没有关系的,因为赋值语句 x = y 也可以放置在 if 判断语句中(C语言中)。
14、防止数值溢出的元素交换方法:
x = x ^ y;
y = x ^ y;
x = x ^ y;
15、
fopen(“foo.txt”, “r”):以只读方式打开文件,该文件必须存在。
fopen(“foo.txt”, “r+”):以读/写方式打开文件,该文件必须存在。
fopen(“foo.txt”, “w”):打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
fopen(“foo.txt”, “w+”):打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
fopen(“foo.txt”, “a”):以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。
参考文献:fopen-百度百科
16、声明语句为 int a[3][4]; 下列表达式中与数组元素 a[2][1] 等价的是?
*(a[2]+1) //可以,这里a[2]表示二维数组的第 3 行一维数组
a[9] //错误
*(a[1]+2) //错误,指向了 a[1][2]
*(*(a+2))+1 //如果改成这样就正确了,*(*(a+2)+1)
c 语言中,数组的默认下标从 0 开始,a[2][1] 也就是数组的第 3 行 第 2 列的元素。
指针参考文献,循序渐进学指针用法:
17、
char a[] =“Hello”;(√)
char a[][]={‘H’,‘e’,‘l’,‘l’,‘o’};(❌,二维数组只有第一维的大小可以省略)
char a[5]= “Hello”;(❌,char 数组默认加一个\0作为结束符,所以这里数组大小需要为 6)
char a[2][5]={ “Hello”,“World”};(❌,原因同上,但是如果第二维只有三个字符是可以放置成功的,参考如下文献)
参考文献:二维字符数组的定义,初始化及引用,C语言二位字符数组详解
18、运算符优先级:
单目运算符:+,-,++,–
算数运算符:+,-,*,/,%
移位运算符:<<,>>
关系运算符:>,<,>=,<=,==,!=
位运算符:&,|,~,^,
逻辑运算符:&&,||
三目运算符:表达式1?表达式2:表达式3;
赋值运算符:=等
口诀:淡云一笔安洛三福,单目>算数运算符>移位>比较>按位>逻辑>三目>赋值