习题纠错02

发布时间 2023-08-30 21:04:55作者: 优秀还天籁

5、C语言中,定义了数组int arr[10],下列关于数组arr的说法中,正确的是: //答案是c
A.arr[0]的值一定是0
B.arr[10]是数组的最后一个元素
C.arr[5]=5.0;会成功赋值,并且arr[5]的值为5
D.arr[5]=5.0;不会成功赋值,因为编译不能通过 //这里需要注意的是,A和B不用说,A未显示初始化,所以不确定,B数组越界,出现未定义行为,c正确,可以浮点数向整数
//赋值会出现隐式类型转换,所以c对D错。

10、C语言的auto型变量存储在: //答案是A
A.动态存储区
B.静态存储区
C.计算机CPU的寄存器中
D.外存储器中 //这里需要注意的是:1、C语言的auto类型变量是默认存储在动态存储区(也称为栈)中的。这意味着它们的生命周期与函数的执行周期相对应。
//当函数被调用时,auto变量被创建,当函数执行完毕时,这些变量会被自动销毁。auto变量的存储是临时的,不会跨越函数调用保持值。
//2、静态存储区用于存储静态变量和全局变量(静态存储区包含bss段和data段)3、计算机CPU的寄存器用于存储高速缓存数据,以提高程序执行效率。
//4、外存储器(例如硬盘或闪存)用于长期存储数据。

11、关于volatile说法错误的是: //答案是c
A.数组可以是volatile
B.const可以是volatile
C.volatile变量一定能确保线程安全
D.每次访问一定是从内存中取出值//这里需要注意的是:1、首先知道,volatile的用处,volatile关键字在C语言中用于告诉编译器该变量可能会被多个线程或者外部因素同时访问或修改,
//从而禁止一些优化操作,确保每次访问都是从内存中取出最新的值。2、虽然volatile可以确保每次访问都是从内存中取出最新的值,但它无法解决多线程并发访问时的原子性和可见性问题。
//如果多个线程同时对volatile变量进行写操作,仍然可能发生竞态条件导致数据不一致。

16、下面选项中关于位运算的叙述正确的是: //答案是A
A.位运算的对象只能是整型或字符型数据
B.位运算符都需要两个操作数
C.左移运算的结果总是原操作数据2倍
D.右移运算时,高位总是补0//这里需要注意的是:A、位运算符的对象只能是,整型(int、long)和字符型(char);B中的操作数,所谓的操作数,便是指参与位运算的数据
//如取反运算符(~)只需要一个操作数。对于c选项并不总是原操作数的2倍。左移运算的结果等于原操作数乘以2的移动位数次方。对于D选项:右移运算时,对于有符号整数,高位使用符号位进行补位,
//即如果原操作数的最高位是1,则高位补1;如果最高位是0,则高位补0。

23、若有以下C函数调用语句 //答案是D
f(m+n,x+y,f(m+n,z,(x,y)));
在此函数定义中, f有多少个参数:
A.6
B.5
C.4
D.3 //这里需要注意的是,进行逐步分解,第一步:分为,m+n、x+y、f(m+n,z,(x,y)) 第二步分解为:m+n、z、

数组定义为“ int a[4];”,表达式 ( ) 是错误的。 //答案是D
A a
B a[0]
C a
D a++ //这是因为数组名 a 是一个常量指针,它指向数组的第一个元素。
//在 C 语言中,数组名是不可修改的(即不能进行自增或自减操作),因此 a++ 是无效的表达式
//
a表示数组第一个元素的值。(指针解引用)

下列描述中,( )是错误的。 //答案是C
A
内联函数的主要解决程序的运行效率问题。
B
内联函数的定义或声明必须出现在内联函数第一次补调用之前。
C
内联函数中可以包括各种语句
D
对内联不可以进行异常接口声明 //这里需要注意的是,内联函数(inline function)是一种函数定义的方式,它提供了一种编译器级别的优化手段。
//内联函数的定义通常放在头文件中,并使用关键字 inline 来声明。内联函数的主要特点是在函数调用的地方将函数的代码直接插入,而不是通过函数调用的方式进行执行。
//这样可以减少函数调用的开销,提高程序的执行效率。C选项错误的原因是在内联函数中,不允许包含复杂的语句,例如函数定义、循环语句(除非循环次数是常量)、递归调用等。
//内联函数通常应该是简单、短小的函数,以便于在调用处进行代码插入。

1
char s[] = "a+b=12\n"; //答案是B
strlen(s) 的返回值为( )。
A 6
B 7
C 8
D 9//这里需要注意的是‘\n’转义字符,代表换行。

在下列表示引用的方法中,( )是正确的。 //答案是A
已知:int m=10;
A int &x=m;
B int &y=10;
C int &z;
D float &t=&m; //B选项中不能对常量进行引用。但是在C++中确实允许的,格式是 int &&y=10; c选项也是错误的,在进行引用的时候
//必须进行初始化操作,引用(或指针)在使用之前需要进行初始化的原因是确保引用(或指针)指向有效的内存地址。
//引用(或指针)是一种特殊的变量类型,它存储了一个内存地址,用于指向其他变量或数据
//当我们声明一个引用(或指针)时,它并不自动指向任何有效的内存地址,它的值是未定义的。
//如果我们在使用一个未初始化的引用(或指针)时,它可能会指向无效的内存地址,这会导致不可预测的行为,甚至引发程序崩溃

若指针p已正确定义,要使p指向两个连续的短整型动态存储单元,不正确的语句是()//答案是A
A p=2(short ) malloc (sizeof( short));
B p=(short
) malloc (2
sizeof(short));
C p=(short ) malloc (22);
D p=(short ) calloc (2,sizeof(short));//这里需要注意的是选项A首先为一个short类型分配了动态内存,然后将指针类型转换为short 。接下来,它将指针的值乘以2,这是错误的。
//我们不能对指针执行乘法操作,这将导致指针指向未知的内存位置。正确的做法应该是分配两个short类型的空间。
//选项B,这是正确的。这里为两个连续的short类型分配了动态内存,并将指针类型转换为short
//选项C正确,这也是正确的。short类型通常占用2个字节(这取决于具体的编译器和平台)。这里为两个连续的short类型分配了动态内存(2 * 2字节),并将指针类型转换为short
//但是,这种写法不具有可移植性,因为short的大小可能在不同的平台上有所不同。
//对于D选项:
//malloc 仅分配指定大小的内存,不进行初始化。 格式是void
malloc(size_t size);
//calloc 分配连续内存并将其初始化为零。 格式是void
calloc(size_t num,size_t size);它接受两个参数:所需分配的元素数量和每个元素的字节数。
//realloc 用于调整已分配内存块的大小。格式是void
realloc(void
ptr, size_t size);它接受两个参数:一个指向之前分配的内存块的指针和新的内存块大小(以字节为单位)。

设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是 //答案是A
A n=0;while(ch=getchar()!='\n')n++; //对于A选项由于赋值和关系运算符优先级,关系较高,那么应该是ch=(getch!='\n');这样ch的值只有0和1;
B n=0;while(getchar()!='\n')n++;
C for(n=0;getchar()!='\n';n++);
D n=0;for(ch=getchar();ch!='\n';n++);

5、从表中任意一个节点出发可以依次访问到表中其他所有节点的结构是: //答案是c
A、线性单链表 B、双向链表 C、循环链表 D、线性链表//这里需要注意是
//线性单链表是一种简单的链表结构,其中每个节点有一个指向下一个节点的指针。从表中任意一个节点出发,可以访问到它之后的节点,但不能访问到它之前的节点。
//B选项虽然可以访问到前一个节点和后一个节点,但是无法一次访问完。(也就是说要想依次访问完所有节点,必须是个环形结构)

10、设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( )最节省时间: //答案是D
A、单链表
B、单循环链表
C、带尾指针的单循环链表
D、带头结点的双循环链表

11、如果最常用的操作是取第i个结点及其前驱,则采用( )存储方式最节省时间: //答案是D
A、单链表 B、双链表 C、单循环链表 D、顺序表 //这里题目中出现了取第i个节点,那就表示可以随机查找,那就选顺序表

13、线性表的顺序存储结构是一种( )的存储结构: //答案是A
A、随机存取 B、顺序存取 C、索引存取 D、散列存取

16、用链接方式存储的队列,在进行删除运算时: //答案是D
A、仅修改头指针
B、仅修改尾指针
C、头、尾指针都要修改
D、头、尾指针可能都要修改//如若只有一个元素的时候,删除时,头尾都要修改,要是元素大于2个时,只需要修改尾指针。

17、设数组a[]作为循环队列SQ的存储空间,数组的长度为m,f为队头指示,r为队尾指示则执行出队 //答案是B
操作的语句为:
A、f=f+1
B、f=(f+1)%m
C、r=(r+1)%m
D、f=(f+1)%(m+1)

18、若已定义: int a[]=[0,1,2,3,4,5,6,7,8,9],p=a,i; 其中0≤i≤9,则对a数组错误的引用是: //答案是D
A、a[p -a] B、
(&a[i]) C、p[i] D、a[10]

19、定义语句"double (*array) [8]"的含义正确的是: //答案是A
A、array是一个指针,它指向一个数组,数组的元素时是双精度实型
B、array是一个数组,数组的每一个元素是指向双精度实型数据的指针
C、C语言中不允许这样的定义语句
D、以上都不对

21、单链表实现的栈,栈顶指针为Top(仅仅是一个指针),入栈一个P节点时,其操作步骤为: //答案是B
A、Top ->next=p;
B、p ->next=Top ->next;Top ->next=p;
C、p ->next=Top;Top=p ->next;
D、p ->next=Top;Top=Top ->next; //这里需要注意的是,对于A选项,只是将栈顶指向了p,但是p没有指向下一个元素。
//对与B选项,p->next = top->next ,这里指的是p指向栈顶原本指向的元素,而top->next = p;这里指将栈顶进行了更新
//对于c选项的话,前一句值p指向top,也即是指向之前栈顶指向的元素,这是正确的,但是栈顶更新是错误的,包括选项D。

26、设栈的顺序存储空间为 S(1:m) ,初始状态为 top=0 。现经过一系列正常的入栈与退栈操作后, //答案是A
top=m+1 ,则栈中的元素个数为:
A、不可能 B、m+1 C、m D、0

28、下列叙述中正确的是: //答案是A
A、在栈中,栈顶指针的动态变化决定栈中元素的个数
B、在循环队列中,队尾指针的动态变化决定队列的长度
C、在循环链表中,头指针和链尾指针的动态变化决定链表的长度
D、在线性链表中,头指针和链尾指针的动态变化决定链表的长度

1、将一棵二叉树的根节点放入队列,然后非递归的执行如下操作:将出队节点的所有 子节点入队。以上操作可以实现哪种遍历( )//答案是D

A、前序遍历 B、中序遍历 C、后续遍历 D、层序编历//这里需要注意的是层次遍历(树)和广度优先遍历(图)是相同的概念
//他们都是同一种遍历方式

15、在二叉树结点的前序序列、中序序列和后序序列中,所有叶结点的先后顺序( ) //答案是B
A、都不相同 B、完全相同 C、前序和中序相同,而与后序不同 D、中序和后序相同,而与前序不同

17、一棵有124个叶结点的完全二叉树,最多有( )个结点//答案是B
A、247 B、248 C、249 D、251
//这里需要注意的是,叶节点是度为0的节点,度为2的节点是度为0的节点的数量减一
//而且度为1度的节点数量要么是0要么是1。

18、求 2n 个数中的最大值和最小值,最少的比较次数是?//答案是C
A、4n/3 B、2n­2 C、3n­2 D、3n/2

19、在排序方法中,元素比较次数与元素的初始排列无关的是() //答案是D
A、冒泡排序 B、归并排序 C、直接插入排序 D、选择排序

22、一个有n个顶点n条边的无向图一定是()//答案是A
A、有环的 B、连通的 C、不连通的 D、无环的

32、下列命题正确的是()//答案是B
A、一个图的邻接矩阵表示是唯一的,邻接表表示也唯一
B、一个图的邻接矩阵表示是唯一的,邻接表表示不唯一
C、一个图的邻接矩阵表示不唯一,邻接表表示是唯一的
D、一个图的邻接矩阵表示不唯一,邻接表表示也不唯一