下列有关 const 限定符说法错误的是:
A、可以将一个非 const 对象的地址赋值给一个指向 const 对象的指针。
B、可以将一个非 const 对象的地址赋给一个指向非 const 对象的指针。
C、一个 const 对象不可以被多次赋值。
D、通过 const 对象指针可以改变全局 const 对象内容。
答案:D
题解:
选项A:
int num;const int *p = #
赋值合法!
选项B:
int num;int *p = #
赋值合法!
选项C:const对象只能被初始化一次,不能被赋值。
选项D:
const int g_num; //全局const对象const int *p = &g_num; //*p = 1; 错误
const 修饰的是 *p,即指针 p 指向的内容不能修改。
二
以下程序的输出是:
int var = 100;int main(){ int var = var; printf(\"%d\\n\", var); return 0;}
A、随机数。
B、100。
C、0。
D、编译失败。
答案:A
题解:
- 当全局变量遇到局部变量,局部变量的优先级更高;
- 没有初始化的局部变量是随机值;
主函数中定义个局部变量,因为没有初始化,所以是随机值。用var来进行初始化,此时的var就是语句前面定义的var而不是全局变量,所以结果就是随机值。
三
以下程序在big-endial架构处理器下的输出是:
int i = 1;char *pc = &i;printf(\"%02x%02x%02x%02x\\n\", pc[0], pc[1], pc[2], pc[3]);
A、1000。
B、0001。
C、01000000。
D、00000001。
答案:D
题解:
大端字节序:低地址存放高字节。
&i取的是整数 i 第一个字节的地址,即 0x100。
%02x表示输出十六进制,且宽度为 2,前面补 0。
四
若入栈的顺序为e,f,g,h,则以下不可能的出栈顺序为:
A、e,f,g,h。
B、f,e,h,g。
C、f,h,e,g。
D、g,f,h,e。
答案:C
题解:
选项A:e进栈、出栈,f进栈、出栈,g进栈、出栈,h进栈、出栈;
选项B:e、f进栈,f出栈、e出栈,g、h进栈,h出栈、g出栈;
选项C:e、f进栈,f出栈,g、h进栈,h出栈,此时g为栈顶,e不可能先出栈;
选项D:e、f、g进栈,g、f出栈,h进栈,h、e出栈。
五
int (*p)[10];
则 p 是一个:
A、数组。
B、指针。
C、函数。
D、其他答案都不对。
答案:B
题解:
p是指针,指向有 10 个元素的数组,每个元素都是整形。
六
关于Linux的文件操作,下面说法正确的是:
A、一个文件的权限为-rwxr-xr-- ,用数字表示是:754。
B、chown -R root:root dir,可以将dir下所有文件的所有者和所属组变为root。
C、mkdir -p dir,若dir目录已存在,shell命令执行时会报错。
D、chmod u+x file1,会给file1的所有者增加可执行权限。
答案:ABD
题解:
选项A:r表示4,w表示2,x表示1;
选项B:chown用于修改属组和属主,-R表示递归,该命令表示修改目录dir以及dir下所有文件的属主和属组为root;
选项C:-p表示递归创建目录,比如:
mkdir -p /home/xx/yy
如果在home目录下不存在 xx 目录,则先创建 xx 目录,再创建 yy 目录。
选项D:chmod用于修改权限,该命令表示给 file1 的拥有者增加可执行权限。
七
关于TCP和UDP协议,下面说法正确的是:
A、TCP基于连接,UDP是无连接的。
B、TCP面向报文传输,UDP面向字节流传输。
C、TCP拥有拥塞控制机制,UDP没有。
D、TCP和UDP都支持多对多通信。
答案:AC
题解:
选项B:TCP基于流,UDP基于数据报;
选项C:TCP具有拥塞控制机制,UDP没有;
选项D:TCP不支持多对多通信。
八
Linux中关于僵尸进程说法正确的是:
A、僵尸进程是由于父进程异常退出造成的。
B、僵尸进程是由于父进程未回收子进程造成的。
C、父进程在创建子进程时,调用2次fork,可以预防僵尸进程。
D、僵尸进程可以使用kill -9杀掉。
答案:B
题解:
所谓僵尸进程,是指进程执行完了已经结束,但是资源没有被回收。如何防止僵尸进程的产生,就是在进程运行结束后,及时回收进程的资源。僵尸进程已经“死了”,无法再用 kill 命令杀死。
九
char c;以下对c的赋值错误的是:
A、c = \"a\"。
B、c = \'a\'。
C、c = \'\\086\'。
D、c = \'\\031\'。
答案:AC
题解:
选项A:不能把字符串赋值给字符;
选项C:0开头的表示八进制,但是八进制最大数是 7,所以写法错误;
选项D:0开头表示八进制,D选项表示 031 的转义字符。
十
已知:
int a[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12};int (*ptr)[3] = a;int *p = a[0];
那么值和 a[3][2]相同的表达式是:
A、*(*(ptr + 3) + 2)。
B、*(*(a + 2) + 3)。
C、*((a + 3)[2])。
D、*(p + 11)。
答案:AD
题解:
ptr:表示行的地址,p:表示元素的地址,a:同ptr。
选项A:ptr + 3指向第四行,取值后变成第四行首元素地址,再加2变成第四行第三个元素的地址,取值后就是 a[3][2]。
选项B:a + 2指向第三行,取值后变成第三行首元素地址,再加 3 变成第四行第一个元素地址,取值后就是 a[3][0]。
选项C:a + 3指向第四行,[2]表示向下两行的首元素地址,即第六行首元素地址,取值后就是 a[5][0],元素不存在。
选项D:p指向首行首元素,向后移动 11 个元素再取值,即 a[3][2]。
十一
以下语句可以看作一条语句的是:
A、i++。
B、int a = 0, b = 0, c = 0。
C、for (i = 0; i < 10; i++);。
D、i > 0 ? a = 0, b = 0。
答案:ABCD
题解:
在C/C++中,四条语句的写法都成立。
十二
链表具有的特点是:
A、不必事先估计存储空间。
B、可随机访问任一元素。
C、插入删除不需要移动元素。
D、所需空间与线性表长度成正比。
答案:ACD
题解:
选项A:链表没有长度限制,需要存储数据的时候就申请内存,不必预估空间。
选项B:链表的存储空间不连续,不能像数组一样随机访问,只能通过某个节点(比如头节点)经过多次移动,访问需要的节点。
选项C:插入和删除操作只需要修改节点的指针域,不需要移动元素。
选项D:节点越多,所需的空间越多。
十三
关于二叉树的说法不正确的是:
A、二叉树的度为2。
B、一棵二叉树的度可以小于2。
C、二叉树中至少有一个节点的度为2。
D、二叉树中任何一个节点的度都为2。
答案:ACD
题解:
度:节点的分支个数。
二叉树:指度不大于 2 的树。
十四
已知二叉树的先序遍历结果是 ABCDEF,后序遍历结果为 CDBFEA,那么中序遍历的结果可以是:
A、CBDAEF。
B、DCAEFB。
C、CBDAFE。
D、CBADFE。
答案:AC
题解:
已知先序遍历和中序遍历,可以确定后序遍历;已知后序遍历和中序遍历,可以确定先序遍历;但是已知先序遍历和后续遍历,由于左右孩子不能确定,所以中序遍历不确定。
先序遍历的特点:根出现在最前面;中序遍历的特点:根出现在中间。
选项A:
选项B:中序遍历的顺序:左-根-右,后序遍历的顺序:左-右-根,所以两种遍历方式,第一个元素是相同的,B选项可以直接PASS。
选项C:和选项A表示的是同一个二叉树。
选项D:CB节点是A的左子树,DFE节点是A的右子树,所以在后序遍历的时候,一定是左子树(包含CB,顺序不一定)、右子树(包含DFE,顺序不一定)、根,与后序遍历结果不一致。
十五
以下哪些上下文的切换由CPU来完成:
A、进程上下文切换。
B、线程上下文切换。
C、协程上下文切换。
D、中断上下文切换。
答案:ABD
题解:
协程属于用户空间。