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;
}正确答案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;
}正确答案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;
}正确答案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;
}正确答案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;正确答案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 的地址值是()。
正确答案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);正确答案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}
};正确答案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;
};Hero h = {"Arthur", 100};Hero h;
h.name = "Arthur";
h.hp = 100;Hero h = new Hero{"Arthur", 100};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;
}正确答案B
解析详情
【答案】B
【考点】结构体数组
【解析】 books[1] 是数组的第二个元素 {"Science",150},成员访问 books[1].title 得到字符串 Science。
【易错点】 数组下标从 0 开始,books[1] 不是第一个 Book。
第 11 题(单选题,2 分)
小杨在对“能量晶石”按亮度进行排序。如果两块晶石亮度相同,他希望保持它们在原始序列中的相对顺序。下列关于排序算法稳定性的说法,错误的是()。
正确答案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;
}正确答案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;
}正确答案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;
}
}正确答案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
解析详情
【答案】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++,因此代码无法通过编译。
【易错点】 数组名可用于指针运算不等于数组名自身可以被重新赋值或自增。