1、请写出 float x 与“零值”比较的 if 语句 if(x>=0.000001&&x<=-0.000001)
2、写出输出结果 AAA,段错误
char* s = “AAA”;
printf(“%s”, s);
s[0] = ‘B’;
printf(“%s”, s);
解析:指针变量是全局变量,对应的是内存中的全局区域。字符串常量保存在只读的数据段,是不可以修改的
3、用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
解析:预处理器将为你计算常数表达式的值,因此不要写出具体数值,这个表达式将使一个16位机的整数溢出,因此要用到长整型符号L,告诉编译器这个常数是长整型
4、下面程序的输出结果是多少 250
//#include < stdio.h >
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~ a >> 4 + 1;
printf(“b = %d\n”, b);
return 0;
}
解析:考察两个知识点:一是类型转换问题,二是运算符优先级的问题,优先级~ > + > 》
0000000010100101取反1111111101011010,再右移(4+1)位,即0000011111111010,要注意取反操作时,会对a进行整形提升,a是无符号的,提升时左边补零
5、(多选)在多重处理系统中,处理死锁的办法有两种:一是防止其发生;二是发生后进行处理。下面的方法属于防止其发生的是哪一个? BC
A、破坏互斥条件
B、破坏不可剥夺条件
C、破坏循环等待条件
D、杀死某个激活死锁的进程
解析:产生死锁的四个必要条件:互斥条件、请求与保持条件、不可剥夺条件、循环等待条件,互斥条件是无法破坏的,而D选项属于死锁事后处理操作
二、简答题
1、系统调用与库函数的区别?
(1)库函数是语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分
(2)库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大
(3)库函数是有缓冲的,系统调用是无缓冲的
(4)系统调用依赖于平台,库函数并不依赖
2、sizeof与strlen的区别?
(1)sizeof是运算符,strlen是函数
(2)Sizeof可以用类型做参数,strlen只能用char *做参数,且必须是以‘\0’结尾
(3)数组做sizeof的参数不退化,传递给strlen就退化为指针了
(4)对于指针,sizeof返回指针占的空间,一般为四个字节,对于数组,sizeof返回数组元素空间,包括‘\0’,strlen不区分,读到‘\0’为止
3、关键字register的用法及注意事项?
寄存器变量,频繁被使用的变量用,请求编译器尽可能地将变量存在CPU内部寄存器中,省去CPU从内存中抓取数据的时间,从而提高程序的运行效率
(1)不能&,&获得的是内存的地址
(2)修饰的变量类型一定是CPU接受的类型
(3)只能修饰局部变量,不能修饰全局变量和函数
4、用联合体判断大小端,大端返回0,小端返回1
union w
{
int a;
char b;
} u;
int judge()
{
u test;
test.a = 1;
if(test.b == 1)
{
return 1;
}
else
{
return 0;
}
}
5、TCP是如何保证数据可靠传输?
TCP为应用程序提供可靠的通信连接,因为他采用了三次握手协议,三次握手协议指的是在发送数据的准备阶段,服务器端和客户端之间需要进行三次交互。
第一次握手:客户端发送SYN包到服务器,并进行SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到SYN包并确认,同时自己发送一个SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN_ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入established状态,完成三次握手
连接建立后,客户端和服务器就开始进行安全可靠的数据传输了。