GESP 客观题评测系统

2026-06-Level-4

2026-06-Level-4

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

单选题

1 题(单选题2 分)

小杨正在编写一个“数字交换器”程序,他希望通过函数交换两个变量的值。请问运行以下代码后,屏幕上输出的是()。

void exchange(int *a, int &b) {
    int t = *a;
    *a = b;
    b = t;
}

int main() {
    int x = 100, y = 200;
    exchange(&x, y);
    cout << x << " " << y;
    return 0;
}
A.
100 200
B.
200 100
C.
200 200
D.
编译错误

正确答案B

解析详情

【答案】B

【考点】指针与引用参数

【解析】 调用 exchange(&x, y) 时,a 指向 x,b 引用 y。函数先保存 x 的值 100,再令 x=200、y=100,因此输出 200 100。

【易错点】 指针解引用和引用参数都能直接修改实参,不能按值传递处理。

2 题(单选题2 分)

下面程序想通过函数计算三门课总分,横线处应填入的是()。

int sumScore(int a, int b, int c) {
    return a + b + c;
}

int main() {
    int chinese = 88, math = 95, english = 90;
    int total = ___;
    cout << total;
    return 0;
}
A.
sumScore
B.
sumScore(chinese, math, english)
C.
sumScore(int chinese, int math, int english)
D.
sumScore(a, b, c)

正确答案B

解析详情

【答案】B

【考点】函数调用

【解析】 sumScore 需要接收三个 int 实参,应调用 sumScore(chinese, math, english),返回 88+95+90=273 并赋给 total。

【易错点】 函数定义中的参数类型不能写在调用表达式中。

3 题(单选题2 分)

下面程序输出结果是()。

int addOne(int x) {
    return x + 1;
}
int main() {
    int a = 6;
    cout << addOne(a) + addOne(3);
    return 0;
}
A.
9
B.
10
C.
11
D.
12

正确答案C

解析详情

【答案】C

【考点】函数返回值

【解析】 addOne(6) 返回 7,addOne(3) 返回 4,两个返回值相加得到 7+4=11。

【易错点】 两次函数调用要分别计算,不能误把实参先相加再只加 1。

4 题(单选题2 分)

关于下面程序,说法正确的是()。

void show() {
    int stars = 5;
}

int main() {
    cout << stars;
    return 0;
}
A.
程序输出 5
B.
程序可以通过编译,但输出随机值
C.
程序不能通过编译,因为 stars 只在 show 函数中有效
D.
程序不能通过编译,因为 cout 不能输出变量

正确答案C

解析详情

【答案】C

【考点】局部变量作用域

【解析】 stars 定义在 show 的函数体内,其作用域仅限于 show。main 中没有名为 stars 的可见声明,因此 cout << stars 会导致编译错误。

【易错点】 函数内的局部变量不会因函数已定义而在其他函数中可见。

5 题(单选题2 分)

小杨在调试一个“等级提升”系统,代码逻辑如下,执行后 *p 的值是()。

int lv = 5, next_lv = 6;
int *p = &lv;
*p = *p + 1;
p = &next_lv;
A.
5
B.
6
C.
lv 的地址
D.
next_lv 的地址

正确答案B

解析详情

【答案】B

【考点】指针赋值与解引用

【解析】 起初 p 指向 lv,执行 *p=*p+1 后 lv 变为 6;随后 p 改为指向 next_lv,而 next_lv 的初值也是 6,所以最终 *p 为 6。

【易错点】 p=&next_lv 只改变指向,不会把 lv 的地址或数值写入 next_lv。

6 题(单选题2 分)

小杨正在开发一款名为“星际网格”的游戏,他用二维数组 int map[5][4]; 来表示地图。已知 int 占4字节,如果 map 的内存地址是 0x2000,则表达式 &map + 1 的地址值是()。

A.
0x204c
B.
0x205c
C.
0x2050
D.
0x2058

正确答案C

解析详情

【答案】C

【考点】二维数组指针运算

【解析】 &map 的步长是整个 int[5][4] 数组,共 5×4×4=80 字节,即十六进制 0x50。故 &map+1 的地址为 0x2000+0x50=0x2050。

【易错点】 不要把 &map+1 的步长误当成一个 int 或一行数组的大小。

7 题(单选题2 分)

执行完下面代码后,变量 val 的值是()。

int data[] = {10, 20, 30, 40, 50};
int *ptr = data + 2;
int val = *(ptr - 1) + *(ptr + 1);
A.
50
B.
60
C.
70
D.
80

正确答案B

解析详情

【答案】B

【考点】指针与数组

【解析】 ptr=data+2 指向 data[2],即 30。ptr-1 指向 data[1]=20,ptr+1 指向 data[3]=40,所以 val=20+40=60。

【易错点】 指针加减移动的是数组元素位置,不是直接对所指的数值做加减。

8 题(单选题2 分)

某班3个小组、每组4名同学的分数存入下面的二维数组 score,则 score[1][2] 的值是()。

int score[3][4] = {
    {80, 81, 82, 83},
    {90, 91, 92, 93},
    {70, 71, 72, 73}
};
A.
81
B.
90
C.
92
D.
72

正确答案C

解析详情

【答案】C

【考点】二维数组下标

【解析】 数组下标从 0 开始,score[1] 是第二行 {90,91,92,93},其中下标 2 对应第三个元素 92。

【易错点】 不要把 score[1][2] 按“第 1 行第 2 列”理解。

9 题(单选题2 分)

小杨定义了一个结构体 Hero 来表示游戏角色,下面哪种初始化方式会由于语法错误导致编译失败?()。

struct Hero {
    string name;
    int hp;
};
A.
Hero h = {"Arthur", 100};
B.
Hero h;
h.name = "Arthur";
h.hp = 100;
C.
Hero h = new Hero{"Arthur", 100};
D.
Hero *p = new Hero{"Arthur", 100};

正确答案C

解析详情

【答案】C

【考点】结构体与动态内存

【解析】 new Hero{"Arthur",100} 返回 Hero* 指针,不能用它初始化 Hero 类型的对象 h。若使用 new,应像 D 一样用 Hero* 接收返回值。

【易错点】 要区分结构体对象 Hero 与指向该对象的指针 Hero*。

10 题(单选题2 分)

下面程序输出结果是()。

struct Book {
    string title;
    int pages;
};
int main() {
    Book books[2] = {{"Math", 120}, {"Science", 150}};
    cout << books[1].title;
    return 0;
}
A.
Math
B.
Science
C.
120
D.
150

正确答案B

解析详情

【答案】B

【考点】结构体数组

【解析】 books[1] 是数组的第二个元素 {"Science",150},成员访问 books[1].title 得到字符串 Science。

【易错点】 数组下标从 0 开始,books[1] 不是第一个 Book。

11 题(单选题2 分)

小杨在对“能量晶石”按亮度进行排序。如果两块晶石亮度相同,他希望保持它们在原始序列中的相对顺序。下列关于排序算法稳定性的说法,错误的是()。

A.
冒泡排序是稳定的,因为只有在左边比右边大时才交换。
B.
插入排序是稳定的,因为它将元素插入到相等元素的右侧。
C.
选择排序是稳定的,因为它每次选出最小元素放在前面。
D.
稳定性是指排序后相等元素的相对位置不发生改变。

正确答案C

解析详情

【答案】C

【考点】排序算法稳定性

【解析】 直接选择排序会把本轮最小元素与前端元素跨位置交换,可能改变相等元素的先后次序,因此通常不稳定。冒泡排序和插入排序采用不交换、不过越相等元素的实现时可以保持稳定。

【易错点】 “每次选最小值”只能说明排序策略,不能保证相等元素的相对次序。

12 题(单选题2 分)

小杨的机器人正在能量踏板上跳跃,踏板编号为 1, 2, 3, …。跳到第 n 块踏板的方案数满足递推式 f(n) = f(n-1) + f(n-2) 。若 f(1) = 1, f(2) = 2 ,则运行以下代码计算 \text{jump}(5) 的结果是()。

int jump(int n) {
    if (n <= 2)
        return n;
    int a = 1, b = 2, c = 0;
    for (int i = 3; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}
A.
5
B.
8
C.
13
D.
21

正确答案B

解析详情

【答案】B

【考点】递推与迭代

【解析】 初值为 f(1)=1、f(2)=2,循环依次算出 f(3)=3、f(4)=5、f(5)=8,因此 jump(5) 返回 8。

【易错点】 该数列从 1、2 开始,不能套用从 0、1 开始的斐波那契下标。

13 题(单选题2 分)

在“模拟实验室”程序中,为了防止除以 0 导致崩溃,小杨使用了异常处理机制。执行以下代码将输出()。

try {
    int x = 10, y = 0;
    if (y == 0) throw "Zero Error";
    cout << x / y;
} catch (int e) {
    cout << "Error Code: " << e;
} catch (const char* msg) {
    cout << "Caught: " << msg;
}
A.
0
B.
Error Code: 0
C.
Caught: Zero Error
D.
程序直接崩溃

正确答案C

解析详情

【答案】C

【考点】异常处理

【解析】 y==0 时抛出字符串字面量 "Zero Error",其类型可由 catch(const char* msg) 捕获。除法语句不会执行,程序输出 Caught: Zero Error。

【易错点】 catch 按异常类型匹配,const char* 异常不会进入 catch(int e)。

14 题(单选题2 分)

下面代码使用某种排序算法,将数组中的元素按从小到大排序。这段代码使用的排序算法是()。

void mystery_sort(double arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int minPos = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minPos]) {
                minPos = j;
            }
        }
        double temp = arr[i];
        arr[i] = arr[minPos];
        arr[minPos] = temp;
    }
}
A.
冒泡排序
B.
插入排序
C.
选择排序
D.
非典型排序

正确答案C

解析详情

【答案】C

【考点】选择排序

【解析】 每一轮先在区间 [i,n-1] 中寻找最小元素下标 minPos,再与 arr[i] 交换,这正是直接选择排序的核心过程。

【易错点】 选择排序每轮只确定一个最小元素的位置,不是反复交换相邻元素。

15 题(单选题2 分)

小杨正在读取“冒险日志”文件 quest.txt。若文件内容为 Level 10,执行以下程序后输出为()。

ifstream fin("quest.txt");
string s;
int v;
fin >> s >> v;
cout << s.length() * v;
A.
50
B.
15
C.
70
D.
5

正确答案A

解析详情

【答案】A

【考点】文件输入与字符串长度

【解析】 运算符 >> 依次读出 s="Level"、v=10;s.length() 为 5,所以输出 5×10=50。

【易错点】 字符串长度只计算 Level 的 5 个字符,不包含分隔空格和数字 10。

判断题

1 题(判断题2 分)

运行以下程序后,变量 a 的值最终会变为 20。

void modify(int *p) {
    *p = *p + 10;
}
int main() {
    int a = 10;
    modify(&a);
    return 0;
}

正确答案正确

解析详情

【答案】正确

【考点】指针参数

【解析】 modify(&a) 将 a 的地址传给 p,*p 与 a 是同一存储位置。执行 *p=*p+10 后,a 从 10 变为 20。

【易错点】 传入的是地址,修改 *p 会影响 main 中的 a。

2 题(判断题2 分)

在 C++ 中,引用一旦初始化并绑定到某个变量后,可以通过赋值语句将其重新绑定到另一个变量。

正确答案错误

解析详情

【答案】错误

【考点】引用绑定

【解析】 C++ 引用初始化后始终绑定原变量。对引用执行赋值,是给它所引用的变量赋值,并不会让引用改为绑定另一个变量。

【易错点】 引用赋值与指针重新指向是两种不同操作。

3 题(判断题2 分)

下面程序可以正确计算并输出 3 名学生的平均成绩。

struct Student {
    int id;
    int score;
};

int main() {
    Student students[3] = {
        {1, 90},
        {2, 80},
        {3, 100}
    };
    int sum = 0;
    for (int i = 0; i < 3; i++) {
        sum += students[i].score;
    }
    double average = sum / 3.0;
    cout << average << endl;
    return 0;
}

正确答案正确

解析详情

【答案】正确

【考点】结构体数组与平均值

【解析】 循环累加三人的 score,得到 sum=90+80+100=270;再计算 270/3.0=90.0,能够正确输出平均成绩。

【易错点】 除数写成 3.0 会进行浮点除法,避免整数除法截断。

4 题(判断题2 分)

选择排序算法在寻找每一轮最小值时,如果遇到相等的元素不进行交换,则选择排序是一种稳定的排序算法。

正确答案错误

解析详情

【答案】错误

【考点】选择排序稳定性

【解析】 即使寻找最小值时不交换相等元素,轮末的跨位置交换仍可能破坏稳定性。例如 [2a,2b,1] 首轮交换后为 [1,2b,2a],两个 2 的相对顺序被颠倒。

【易错点】 稳定性取决于整个排序过程,不能只检查比较相等元素时是否交换。

5 题(判断题2 分)

如果使用带 flag 的冒泡排序,且待排序数组一开始就是有序的,那么算法只需一轮扫描即可结束,时间复杂度为 O(n) 。

正确答案正确

解析详情

【答案】正确

【考点】冒泡排序优化

【解析】 数组已有序时,第一轮扫描不会发生任何交换,flag 保持“未交换”状态并触发提前结束。该轮只做约 n-1 次比较,时间复杂度为 O(n)。

【易错点】 O(n) 是带提前退出标记时的最好情况,不是普通冒泡排序的所有情况。

6 题(判断题2 分)

在 C++ 中定义二维数组并初始化时,可以省略第一维,但不能省略第二维。因此 int a[][2] = {{1, 2}, {3, 4}}; 是合法的,而 int a[][] = {{1, 2}, {3, 4}}; 是不合法的。

正确答案正确

解析详情

【答案】正确

【考点】二维数组声明

【解析】 有初始化列表时,编译器可由两组元素推导第一维为 2;但定位 a[i][j] 必须知道每行长度,因此第二维 2 不能省略,int a[][] 不合法。

【易错点】 可省略的是最左侧第一维,不是任意一个维度。

7 题(判断题2 分)

下面代码的时间复杂度是 O(2^{n}) 。

int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cnt++;
}
}

正确答案错误

解析详情

【答案】错误

【考点】嵌套循环时间复杂度

【解析】 内层循环在第 i 轮执行 i 次,总次数为 1+2+…+n=n(n+1)/2,因此时间复杂度是 O(n²),不是 O(2^n)。

【易错点】 两层循环不一定直接相乘,也不代表指数复杂度,应累计实际迭代次数。

8 题(判断题2 分)

假设文件 output.txt 能正常打开,下面代码通过 rdbuf 将 cout 的输出重定向到了文件中。

ofstream fout("output.txt");
streambuf* old_buf = cout.rdbuf();
cout.rdbuf(fout.rdbuf());
cout << "GESP Exam";
cout.rdbuf(old_buf);

正确答案正确

解析详情

【答案】正确

【考点】流缓冲区重定向

【解析】 先保存 cout 原来的缓冲区,再把 cout.rdbuf() 设置为 fout.rdbuf(),所以 "GESP Exam" 被写入 output.txt;最后恢复 old_buf,使后续 cout 输出回到原目标。

【易错点】 重定向的是 cout 的缓冲区,使用完后应恢复原缓冲区。

9 题(判断题2 分)

小杨想通过下面程序给饭卡充值,程序会输出 70。

void recharge(int money) {
    money += 20;
}

int main() {
    int card = 50;
    recharge(card);
    cout << card;
    return 0;
}

正确答案错误

解析详情

【答案】错误

【考点】值传递

【解析】 recharge 的形参 money 是 card 的副本,money+=20 只把副本改为 70,不会改变 card。函数返回后 cout 仍输出 50。

【易错点】 值传递不会修改实参;要修改 card 需使用引用或指针参数。

10 题(判断题2 分)

下面代码可以通过编译。

int a[5];
a++;

正确答案错误

解析详情

【答案】错误

【考点】数组名与指针

【解析】 数组名 a 在表达式中通常可转换为指向首元素的指针,但 a 本身不是可修改的指针变量,不能执行 a++,因此代码无法通过编译。

【易错点】 数组名可用于指针运算不等于数组名自身可以被重新赋值或自增。