GESP 客观题评测系统

2023-09-Level-4

2023-09-Level-4

试卷解析总览,可直接查看每题答案与解析。

单选题(每题 2 分)

1 题(单选题

人们所使用的手机上安装的App通常指的是()。

A.
一款操作系统
B.
一款应用软件
C.
一种通话设备
D.
以上都不对

正确答案B

解析详情

【答案】B

【考点】计算机基础知识

【解析】 App 是 Application 的缩写,意为“应用软件”。它运行在操作系统(如 Android、iOS)之上,为用户提供特定的功能服务,如社交、办公、游戏等。

【易错点】 误将应用软件(App)与底层的操作系统混淆。

2 题(单选题

下列流程图的输出结果是?()

Image
A.
9
B.
7
C.
5
D.
11

正确答案A

解析详情

【答案】A

【考点】流程图与循环逻辑

【解析】 根据流程图逻辑进行模拟:初始变量经过循环累加或条件判断。按照图中路径追踪变量变化,最终输出结果指向数值 9。该类题需严格遵循分支条件执行顺序。

【易错点】 在循环判定条件处(如“是”或“否”的方向)出现追踪偏差。

3 题(单选题

对包含 n 个元素的数组进行冒泡排序,平均时间复杂度一般为()。

A.
O(n)O(n)
B.
O(nlogn)O(n \log n)
C.
O(n2)O(n^{2})
D.
以上都不正确

正确答案C

解析详情

【答案】C

【考点】排序算法复杂度

【解析】 冒泡排序采用嵌套的双重循环:外层循环执行 n-1 次,内层循环平均执行 n/2 次。总的比较与交换次数级别为 n * (n-1) / 2,因此平均时间复杂度为 O(n²)。

【易错点】 将冒泡排序与快速排序、归并排序等 O(n log n) 的算法复杂度混淆。

4 题(单选题

下列关于 C++ 语言中指针的叙述,不正确的是()。

A.
可以定义指向 int 类型的指针。
B.
可以定义指向自定义结构体类型的指针。
C.
自定义结构体类型可以包含指针类型的元素。
D.
不能定义指向void类型的指针,那没有意义。

正确答案D

解析详情

【答案】D

【考点】C++ 指针基础

【解析】 C++ 语言允许定义 void 类型的指针(void*),它被称为“万能指针”,可以指向任意类型的数据地址,在动态内存分配和通用接口设计中非常有意义。故 D 选项叙述错误。

【易错点】 误认为 void 表示“空”或“无”,从而判定不能定义对应的指针类型。

5 题(单选题

下列关于 C++ 语言中数组的叙述,不正确的是()。

A.
一维数组可以用来表示数列。
B.
二维数组可以用来表示矩阵。
C.
三维数组可以用来表示空间中物体的形状。
D.
世界是三维的,所以定义四维数组没有意义。

正确答案D

解析详情

【答案】D

【考点】多维数组的概念

【解析】 在 C++ 中,数组的维数没有逻辑上限。四维及更高维度的数组在处理科学计算、高维数据建模等复杂场景时非常有用。D 选项称定义四维数组没有意义是不正确的。

【易错点】 受限于物理空间直观感受,认为编程语言中的数组维度也受物理空间限制。

6 题(单选题

下列关于C++语言中函数的叙述,正确的是()。

A.
函数调用前必须定义。
B.
函数调用时必须提供足够的实际参数。
C.
函数定义前必须声明。
D.
函数声明只能写在函数调用前。

正确答案B

解析详情

【答案】B

【考点】函数声明与调用

【解析】 函数调用时提供的实参必须与函数定义或声明中的形参列表(数量和类型)相匹配。A 和 C 错误是因为只要有前置声明即可调用,不要求定义一定在前;D 错误是因为声明可以多次出现。

【易错点】 混淆“函数定义”与“函数声明”在调用前后的必要性要求。

7 题(单选题

下列关于 C++ 语言中函数的叙述,不正确的是()。

A.
两个函数的声明可以相同。
B.
两个函数的局部变量可以重名。
C.
两个函数的参数可以重名。
D.
两个函数可以重名。

正确答案A

解析详情

【答案】A

【考点】函数声明与命名空间

【解析】 在同一作用域内,如果两个函数声明完全相同(名称、参数、返回类型均一致),编译器会认为它们是同一个函数的多次声明,这是允许的。题目要求选不正确的,故 A 入选。

【易错点】 误以为“重复声明”在 C++ 中是语法错误,实际上只要声明内容一致是合法的。

8 题(单选题

一个二维数组定义为 char array[3][10];则这个二维数组占用内存的大小为()。

A.
10
B.
30
C.
32
D.
48

正确答案B

解析详情

【答案】B

【考点】数组内存空间计算

【解析】 内存大小 = 元素总数 * 每个元素所占字节。该数组总元素数为 3 * 10 = 30 个。由于类型是 char,每个 char 占用 1 字节,故总大小为 30 * 1 = 30 字节。

【易错点】 错误地将 char 类型视为 2 字节或 4 字节,或者在计算总元素数时出错。

9 题(单选题

如果 n 为 int 类型的变量,一个指针变量定义为 int *p = &n;,则下列说法正确的是()。

A.
指针变量 p 的值与变量 n 是相同的。
B.
指针变量 p 的值 with 变量 n 的地址是相同的。
C.
指针变量 p 指向的值为 'n'。
D.
指针变量 p 指向的值与变量 n 的地址是相同的。

正确答案B

解析详情

【答案】B

【考点】指针变量的定义与含义

【解析】 指针变量存储的是另一个变量的内存地址。定义 `int *p = &n` 后,变量 `p` 的值就是变量 `n` 的首地址。`*p` 才表示 `n` 的具体数值内容。故 B 正确。

【易错点】 混淆指针变量本身的值(地址)与其指向的值(变量内容)。

10 题(单选题

一个三维数组定义为 long long array[6][6][6];则 array[1][2][3] 和 array[3][2][1] 在内存中的位置相差多少字节?()

A.
70字节
B.
198字节
C.
560字节
D.
无法确定

正确答案C

解析详情

【答案】C

【考点】多维数组寻址计算

【解析】 在内存中线性展开,`array[i][j][k]` 的位置序号为 `i*36 + j*6 + k`。位置 1:`1*36+2*6+3 = 51`;位置 2:`3*36+2*6+1 = 121`。相差 70 个元素。每个 `long long` 占 8 字节,故差 `70 * 8 = 560` 字节。

【易错点】 忘记 `long long` 类型占用 8 字节,或在计算三维坐标转换线性序号时出错。

11 题(单选题

如果 a 为 int 类型的变量,且 a 的值为6,则执行 a = ~a;之后,a 的值会是()。

A.
-6
B.
6
C.
-7
D.
7

正确答案C

解析详情

【答案】C

【考点】位运算(按位取反)

【解析】 按位取反操作公式为 `~x = -(x + 1)`。代入计算:`~6 = -(6 + 1) = -7`。从二进制补码角度看,6 为 `00...0110`,取反后为 `11...1001`,即 -7 的补码表示。

【易错点】 错误地认为取反只是简单的正负号翻转(变成 -6)。

12 题(单选题

一个数组定义为 int a[5] = {1, 2, 3, 4, 5};,一个指针定义为 int * p = &a[2];,则执行 *p = a[1]; 后,数组a中的值会变为()。

A.
{1, 2, 2, 4, 5}
B.
{1, 3, 3, 4, 5}
C.
{1, 2, 3, 3, 5}
D.
{1, 2, 4, 4, 5}

正确答案A

解析详情

【答案】A

【考点】指针间接引用与数组更新

【解析】 指针 `p` 指向 `a[2]`(值为 3)。执行 `*p = a[1]` 相当于执行 `a[2] = a[1]`。由于 `a[1]` 的值为 2,操作后 `a[2]` 也变为 2。数组整体变为 `{1, 2, 2, 4, 5}`。

【易错点】 将数组下标(从 0 开始)搞错,或者对解引用操作 `*p` 修改了哪个位置判断失误。

13 题(单选题

下列关于C++语言中异常处理的叙述,正确的是()。

A.
一个 try 子句可以有多个 catch 子句与之对应。
B.
如果 try 子句在执行时发生异常,就一定会进入某一个 catch 子句执行。
C.
如果 try 子句中没有可能发生异常的语句,会产生编译错误。
D.
catch 子句处理异常后,会重新执行与之对应的 try 子句。

正确答案A

解析详情

【答案】A

【考点】C++ 异常处理机制

【解析】 在 C++ 的 `try-catch` 结构中,一个 `try` 块后面可以紧跟多个 `catch` 块,以便捕获并处理不同类型的异常。这是异常多态处理的标准写法。B、C、D 描述均存在逻辑或语法偏差。

【易错点】 误认为 `try` 只能对应一个 `catch` 块。

14 题(单选题

执行以下C++语言程序后,输出结果是()。

#include <iostream>
using namespace std;

int main() {
    int fib[10];
    fib[0] = 0;
    fib[1] = 1;
    for (int i = 2; i < 10; i++)
        fib[i] = fib[i - 1] + fib[i - 2];
    cout << fib[10] << endl;
    return 0;
}
A.
0
B.
5
C.
55
D.
无法确定。

正确答案D

解析详情

【答案】D

【考点】数组越界访问

【解析】 代码定义了长度为 10 的数组 `fib`,合法下标范围是 0 到 9。最后输出语句尝试访问 `fib[10]`,这属于数组越界行为。在 C++ 中,这种行为会导致未定义的后果,输出结果无法确定。

【易错点】 习惯性计算斐波那契数列第 11 项的值而忽略了下标越界问题。

15 题(单选题

在下列代码的横线处填写(),完成对有 n 个 int 类型元素的数组 array 由小到大排序。

void BubbleSort(int array[], int n) {
    for (int i = n; i >= 2; i--)
        for (____) // 在此处填入代码
            if (array[j] > array[j + 1]) {
                int t = array[j];
                array[j] = array[j + 1];
                array[j + 1] = t;
            }
        }

    }
A.
int j = 1; j < n; j++
B.
int j = 0; j < n; j++
C.
int j = 0; j < i - 1; j++
D.
int j = 0; j < i; j++

正确答案C

解析详情

【答案】C

【考点】冒泡排序逻辑实现

【解析】 外层循环控制已排序元素的个数,`i` 逐渐减小。内层循环需要从数组开头(`j=0`)开始比较相邻元素,范围应持续到未排序部分的末尾。填入 `int j = 0; j < i - 1; j++` 能确保 `j+1` 最大访问到 `i-1`,符合冒泡排序逻辑。

【易错点】 循环边界设置不当,导致数组访问越界或无法完成全序排列。

判断题(每题 2 分)

1 题(判断题

在C++语言中,指针变量在逻辑上指向另一个变量在内存中的位置,指针变量本身不占用内存。

正确答案错误

解析详情

【答案】错误

【考点】指针变量的内存占用

【解析】 指针变量本身也是一种变量,需要在内存中占用空间来存储其所指向的地址。在 32 位环境下通常占 4 字节,在 64 位环境下占 8 字节。

【易错点】 误认为指针只是一个抽象的“箭头”,不需要消耗实际的存储空间。

2 题(判断题

对N个元素的数组执行插入排序算法,通常的时间复杂度是O(N2)O(N^{2})

正确答案正确

解析详情

【答案】正确

【考点】排序算法复杂度

【解析】 插入排序在最坏和平均情况下,都需要对每个元素进行其位置前方的遍历寻找插入点,计算规模与 N 的平方成正比,即时间复杂度为 O(N²)。

【易错点】 混淆插入排序与最好情况(已排序数组)下的 O(N) 复杂度。

3 题(判断题

在C++语言中,每个变量都有其作用域。

正确答案正确

解析详情

【答案】正确

【考点】变量作用域

【解析】 C++ 语言规定每个变量都必须在特定的作用域内定义(如局部、全局、命名空间或类作用域),这决定了变量的可访问范围和生命周期。

【易错点】 无

4 题(判断题

在C++语言中,在函数调用时,通过引用传递的参数不会复制实际参数,因此不会额外占用内存。

正确答案错误

解析详情

【答案】错误

【考点】引用传递原理

【解析】 虽然引用传递避免了对象副本的创建,但在底层实现中,引用通常通过指针来完成寻址。此外,函数调用的参数管理本身需要在栈上消耗少量空间来维护引用关系。故“不会额外占用内存”的说法过于绝对。

【易错点】 过度简化引用的实现机制,认为没有任何资源消耗。

5 题(判断题

在C++语言中,可以通过定义结构体,定义一个新的数据类型。

正确答案正确

解析详情

【答案】正确

【考点】结构体(Struct)

【解析】 结构体允许开发者将不同类型的数据组合在一起,定义出一个符合特定逻辑需求的新类型(User-defined Type),这是 C++ 面向对象和复杂数据处理的基础。

【易错点】 无

6 题(判断题

在C++语言中,可以定义结构体类型的数组变量,定义结构体时也可以包含数组成员。

正确答案正确

解析详情

【答案】正确

【考点】结构体与数组的组合应用

【解析】 C++ 语法支持复合数据结构的嵌套应用:既可以声明一个元素为结构体的数组,也可以在结构体内部声明数组成员变量。这在建模复杂对象时非常常见。

【易错点】 无

7 题(判断题

如果希望记录 10 个最长为 99 字节的字符串,可以将字符串数组定义为 char s[10][100]。

正确答案正确

解析详情

【答案】正确

【考点】二维字符数组与 C 风格字符串

【解析】 C 风格字符串以空字符 `\0` 结尾。因此,100 个字节的空间最多可以存放 99 个可见字符加上 1 个终止符。定义 `char s[10][100]` 完全符合记录 10 个最长 99 字节字符串的需求。

【易错点】 忽略了 C 风格字符串需要额外 1 字节存放 `\0` 终止符。

8 题(判断题

一个可能抛出异常的函数,调用它的位置没有在 try 子句中,会引起编译错误。

正确答案错误

解析详情

【答案】错误

【考点】异常处理机制

【解析】 在 C++ 中,并不强制要求在 `try` 块中调用可能抛出异常的函数。如果异常抛出且当前层没有处理,它会沿着调用栈向上传递,直到被捕获或导致程序终止(调用 `std::terminate`),这不会导致编译阶段报错。

【易错点】 混淆了 C++ 与 Java 等语言(如 Java 的受检异常必须捕获或声明)的编译规则。

9 题(判断题

== 和 := 都是C++语言的运算符。

正确答案错误

解析详情

【答案】错误

【考点】C++ 运算符

【解析】 `==` 是 C++ 中的等值比较运算符。而 `:=` 常见于 Pascal、Go 等语言中表示声明并赋值,但在 C++ 中并不是有效的运算符。

【易错点】 将其他编程语言的语法习惯带入 C++。

10 题(判断题

通过使用文件重定向操作,可以将程序中输出到 `cout` 的内容输出到文件中,这是常用的记录程序运行日志的方法之一。

正确答案正确

解析详情

【答案】正确

【考点】标准 I/O 重定向

【解析】 在操作系统或编程环境(如使用 `freopen`)中,可以将标准输出(`stdout`,对应 `cout`)重定向到指定文件,从而实现日志记录功能,而无需修改原有的 `cout` 输出代码。

【易错点】 无