【GESP】C++ 2025年6月一级考试-客观题真题解析
以下是个人关于2025年6月GESP C++ 一级考试选择和判断题的答案解析,仅供参考。
一、选择题
第1题
2025年4月19日在北京举行了一场人形机器人半程马拉松。⽐赛期间,跑动着的机器⼈会利⽤⾝上安装的多个传感器所反馈的数据来调整姿态、保持平衡等,那么这类传感器类似于计算机的()。
- A. 处理器
- B. 存储器
- C. 输入设备
- D. 输出设备
答案: C
📘 解析
在计算机系统中:
- 处理器(CPU):是计算核心,处理和运算数据。
- 存储器(Memory):用于保存数据与指令。
- 输入设备(Input device):用于将外部信息输入计算机系统,如键盘、鼠标、摄像头、传感器等。
- 输出设备(Output device):用于将处理结果展示给外部,如显示器、打印机、音箱等。
本题中的“传感器”,作用是采集数据(如温度、速度、姿态)并传入机器人控制系统中。这与我们使用键盘输入文字到计算机系统中是一样的行为本质。
📌 知识点扩展
- 典型输入设备:键盘、鼠标、摄像头、麦克风、传感器、扫码枪。
- 典型输出设备:显示器、音响、打印机、机械臂。
机器人系统中的“感知-决策-执行”模型:
- 感知(传感器 → 输入设备)
- 决策(处理器 → 控制器)
- 执行(驱动器 → 输出设备)
第2题
在某集成开发环境中调试下⾯代码段时尝试设置断点和检查局部变量,下⾯哪个说法是错误的( )。
1
2
3
4
5
6
int i, N = 0; // L1
cin >> N; // L2
for (i = 1; i < 9; i++)
if (N % i == 0) break; // L3
if (i < 9)
printf("N不能大于9\n"); // L4
- A. 断点不可以设在L1标记的代码⾏
- B. 执⾏暂停在L2标记的代码⾏时,可以检测i的值
- C. 执⾏暂停在L3标记的代码⾏时,可以修改i的值
- D. 执⾏有可能暂停在L4标记的代码⾏
答案: A
📘 解析
- L1 是声明语句,在大多数调试器中(如 Visual Studio、gdb),声明语句也可以设置断点。选项 A 说”不可以设在 L1”是错误的。声明语句虽然不是可执行语句,但编译器会为其生成相应的机器码,因此可以设置断点。
- B 正确:L2 执行前变量已声明,i 值可查看(默认为未初始化,调试器中可见或为垃圾值)。
- C 正确:调试器可在 L3 修改 i 的值,改变程序走向。
- D 正确:如果输入满足
N % i == 0
,可能跳过 L4,否则可以执行到 L4。
📌 知识点扩展
- 断点只能设在真正编译后生成机器码的行。
- 常见可设置断点位置:
cin
,cout
,if
,for
, 函数调用等。 - 调试器中可以:
- 设置/删除断点
- 查看变量值
- 修改变量值
- 单步执行(Step In、Step Over、Step Out)
第3题
对下列C++的代码,描述准确的是( )。
1
2
3
4
int first = 10;
printf("{%d}\n", First);
- A. 执⾏后输出10
- B. 执⾏后输出 {First}
- C. 执⾏后输出 “{First}”
- D. 编译报错,因为First应该是first
答案: D
📘 解析
- 变量
first
是小写,First
(大写)未定义。 - C++ 是大小写敏感的语言,
first ≠ First
,编译器会报 “未定义标识符”。
📌 知识点扩展
变量命名区分大小写,这点不同于某些脚本语言(如 Bash)。
printf("{%d}\n", First);
将尝试输出一个未声明变量,导致编译失败。
第4题
在C++中,下列可以做变量名的是( )。
- A. X.cpp
- B. X-cpp
- C. X#cpp
- D. X_cpp
答案: D
📘 解析
合法变量名规则:
- 可以包含字母、数字、下划线。
- 不可以数字开头。
- 不允许含有特殊字符(如
.
,-
,#
)。 - 不得与保留关键字冲突。
第5题
C++表达式 14 - 3 * 3 % 2
的值是( )。
- A. 0
- B. 11
- C. 13
- D. -67
答案: C
📘 解析
运算符优先级:
*
与%
优先于-
,从左到右依次执行:3 * 3 = 9
9 % 2 = 1
14 - 1 = 13
📌 知识点延伸
C++ 中常见算术运算符优先级(高到低):
* / %
+ -
- 赋值:
=
,+=
,-=
括号可用来修改默认优先级,如:
1
a = (b + c) * d;
第6题
下⾯的C++代码执⾏后,其输出是()。
1
2
3
4
5
int x = 10, y = 20;
x = x + y;
y = x - y;
x = x - y;
cout << x << ' ' << y;
- A. 10 20
- B. 20 10
- C. 10 10
- D. 20 20
答案: B
📘 解析
代码执行过程:
x = x + y
→x = 10 + 20 = 30
y = x - y
→y = 30 - 20 = 10
x = x - y
→x = 30 - 10 = 20
这是一个经典的不使用临时变量交换两个数的算法。通过巧妙利用加减运算,最终实现了 x 和 y 的值互换:
- 初始:
x = 10, y = 20
- 结果:
x = 20, y = 10
所以最终输出:20 10
第7题
定义整型变量 int a=16 ,则执⾏ ++a += 3 之后,a的值会是( )。
- A. 3
- B. 17
- C. 19
- D. 20
答案: D
📘 解析
语句 ++a += 3;
相当于:
++a
先对a
进行前置自增(变为 17);- 然后执行
17 += 3
,结果是 20。
第8题
C++的 int 类型变量 X 的值为8,如果执⾏ cout « (++X)++; ,则输出和执⾏后 X 的值分别是( )。
- A. 8 9
- B. 9 9
- C. 9 10
- D. 编译错误,无法执行
答案: C
📘 解析
分析执行过程:
++X
先将 X 从 8 自增为 9- 输出此时的 X 值:9
- 后缀自增
++
在输出后执行,X 再次自增为 10
所以:
- 输出值为 9(前缀自增后的值)
- 执行后 X 的最终值为 10(后缀自增的结果)
这是一个合法的 C++ 表达式,因为前缀自增 ++X
返回的是左值引用,可以继续进行后缀自增操作。
📌 知识点扩展
前置自增(++i)和后置自增(i++)的主要区别:
- 执行顺序不同:
++i
:先将 i 加1,再返回 i 的值i++
:先返回 i 的原值,再将 i 加1
- 返回值类型不同:
++i
:返回左值引用(可继续操作)i++
:返回右值(临时值)
示例:
1
2
3
int i = 1;
int j = ++i; // j = 2, i = 2(先加1,再赋值)
int k = i++; // k = 2, i = 3(先赋值,再加1)
第9题
下⾯C++代码执⾏后的输出是()
1
2
3
4
int a,b;
a = 3;
b = 4;
printf("a+b=%02d#a+b={a+b}", a+b, a+b);
- A. a+b=07#a+b={a+b}
- B. a+b= 7#a+b=7
- C. a+b=07#a+b=7
- D. a+b=7#a+b=7
答案: A
📘 解析
分析 printf
语句:
%02d
格式说明符:%d
表示输出整数0
表示用0填充空位2
表示最小宽度为2位
- 字符串中的
{a+b}
会原样输出,不会被解析为变量。
所以输出结果为:
a+b=07
(因为 3+4=7,用0填充到2位)#a+b={a+b}
(后面的字符串原样输出)
最终完整输出:a+b=07#a+b={a+b}
第10题
下⾯的C++代码⽤于求M天后是星期⼏,两处横线处分别应填⼊的代码是()。
1
2
3
4
5
6
7
8
9
10
int N, M, D;
cout << "当前星期几? "; // 星期日是0
cin >> N;
cout << "求多少天后? "; // 输入正整数
cin >> M;
D = ____________;
if (____________)
printf("%d天后是星期日", M);
else
printf("%d天后是星期%d", M, D);
- A.
1
2
(N + M) / 7
D == 0
- B.
1
2
(N + M) % 7
D == 0
- C.
1
2
(N + M) / 7
D <= 0
- D.
1
2
(N + M) % 7
D = 0
答案: B
📘 解析
- 一周有7天,模7运算可判断是否回到周日。
D = (N + M) % 7
得到M天后的星期数。- 若
D == 0
,表示星期日。
第11题
下⾯C++代码执⾏后输出是( )。
1
2
3
4
5
6
7
8
9
int i;
for (i = 1; i < 11; i += 3){
continue;
if (i % 2 == 0)
break;
printf("%d#", i);
}
if (i >= 11)
printf("END");
- A. END
- B. 1#
- C. 1#4#END
- D. 1#4#7#10#END
答案: A
📘 解析
continue;
在每次循环一开始就执行,跳过后续所有语句。- 所以
printf("%d#", i);
永远不会执行。 i += 3
从 1 → 4 → 7 → 10 → 13,最后循环结束后满足i >= 11
,执行printf("END");
第12题
下⾯的C++代码⽤于求N的所有因数(即能将N整除的数),如输⼊12则将输出 12,6,4,3,2,1 。( )。
1
2
3
4
5
6
7
8
9
10
int i, N;
cin >> N;
i = N;
while (_______) {
if (N % i == 0) {
printf("%d,", i);
}
i -= 1;
}
printf("1");
- A. i -= 1
- B. i == 1
- C. i > 1
- D. i >= 1
答案: C
📘 解析
分析代码执行过程:
- 循环条件
i > 1
是正确的,因为:- 代码最后单独输出了 1,所以循环中不需要处理 i=1 的情况
- 从 N 开始递减,直到 i=2 为止
- i=1 时退出循环,执行最后的 printf(“1”)
- 其他选项分析:
i -= 1
:这是循环体内的递减操作,不是循环条件i == 1
:这会导致循环永远不执行(除非 N=1)i >= 1
:会导致重复输出1
- 示例执行(N=12):
- i=12 → 输出12
- i=11 → 不是因数,跳过
- i=10 → 不是因数,跳过
- i=6 → 输出6
- i=4 → 输出4
- i=3 → 输出3
- i=2 → 输出2
- 循环结束,输出1
所以最终输出:12,6,4,3,2,1
第13题
下⾯C++代码执⾏后输出的是( )。
1
2
3
4
5
6
7
8
9
int Sum = 0;
for (int i = 0; i < 10; i++){
if (i % 2 == 0)
continue;
if (i % 5 == 0)
break;
Sum += i;
}
cout << Sum;
- A. 55
- B. 15
- C. 9
- D. 4
答案: D
📘 解析
让我们逐步分析代码执行过程:
- i = 0 时:
- 是偶数,执行 continue
- Sum 仍为 0
- i = 1 时:
- 不是偶数,不执行 continue
- 不是 5 的倍数,不执行 break
- Sum += 1,Sum 变为 1
- i = 2 时:
- 是偶数,执行 continue
- Sum 仍为 1
- i = 3 时:
- 不是偶数,不执行 continue
- 不是 5 的倍数,不执行 break
- Sum += 3,Sum 变为 4
- i = 4 时:
- 是偶数,执行 continue
- Sum 仍为 4
- i = 5 时:
- 不是偶数,不执行 continue
- 是 5 的倍数,执行 break
- 循环终止,Sum 保持为 4
累计:1 + 3 = 4
第14题
试图编译并执⾏下⾯C++代码,下⾯描述正确的是()。
1
2
3
4
float x;
x = 101;
x++;
cout << ++x;
- A. 输出 101
- B. 输出 102
- C. 输出 103
- D. 编译将报错,⽆法执⾏
答案: C
📘 解析
x = 101;
x++
:x = 102(后置自增)++x
:x = 103,输出103
📌 知识点扩展
- 前置:
++x
先加后用 - 后置:
x++
先用后加
第15题
以下C++代码可以找出百位、⼗位和个位满⾜特定条件的三位数,横线处应该填⼊的是( )
1
2
3
4
5
6
7
8
9
int count = 0;
for (int i = 100; i <= 999; i++) {
int a = i / 100;
_________________________
int c = i % 10;
if (a * a + b * b == c * c) {
count++;
}
}
- A. int b = (i / 10) / 10;
- B. int b = (i / 10) % 10;
- C. int b = (i % 10) / 10;
- D. int b = (i % 10) % 10;
正确答案: B
📘 解析
- 百位:
i / 100
- 十位:先去掉个位 →
i / 10
,再取个位 →% 10
- 个位:
i % 10
二、判断题
第1题
⼈们现在参加很多闭卷考试时通常都不允许带智能⼿机、平板电脑等,此外很多种智能⼿表同样因为具有嵌⼊操作系统及通信等功能,所以也不允许随⾝携带。( )
答案: √ 正确
📘 解析
智能设备(包括手表)因其具备:
- 存储能力(可查看资料)、
- 通信能力(可联网、远程传输数据)、
- 编程能力(部分可运行脚本)
在考试场合容易造成作弊风险,故被视作禁止物品。
第2题
如果N是C++的整型变量,值为5,则表达式 (N + !N) 的值为4。 ()
答案: × 错误
📘 解析
!N
是逻辑非:!5 = 0
(非0即真,逻辑非返回0)
所以:
N + !N = 5 + 0 = 5
📌 知识点扩展
逻辑非:
!x
- $x \neq 0 \rightarrow !x = 0$
- $x = 0 \rightarrow !x = 1$
第3题
在下⾯C++代码中,删除break语句对程序执⾏结果没有影响。( )
1
2
3
4
5
6
7
8
int i;
for (i = 0; i < 10; i++){
continue;
cout << i << "#";
break;
}
if (i >= 10)
cout << "END";
答案: √ 正确
📘 解析
- 由于每次循环开始就执行
continue
,导致后面的cout
和break
语句都不会被执行到。 - 循环会一直执行到
i=10
时结束,然后执行if (i >= 10)
输出"END"
。 - 因为
break
语句永远不会被执行到,所以删除它对程序的执行结果确实没有任何影响。
第4题
删除下⾯C++代码中的continue后其输出是0#2#4#6#8#。( )
1
2
3
4
5
6
7
8
9
int i;
for (i = 0; i < 10; i++) {
if (i % 2 == 0) {
cout << i << "#";
continue;
}
}
if (i >= 10)
cout << "END";
答案: × 错误
📘 解析
代码中的 if
判断已经控制了只有偶数时才会执行输出语句。continue
语句虽然会跳过后续代码,但在这里是多余的,因为 if
块内已经没有其他需要执行的语句。
循环内只会在 i 为偶数时输出 i#
,循环结束后会输出 END
。最终完整输出为:0#2#4#6#8#END
。
第5题
将下⾯C++代码中的i < 100; i = i + 1
修改为i < 200; i += i + 1
,其输出与当前代码输出相同。( )
1
2
3
int cnt = 0;
for (int i = 0; i < 100; i = i + 1)
cnt += 1;
答案: × 错误
📘 解析
让我们分析两种情况:
- 原代码
i = i + 1
:- i 的变化: 0 → 1 → 2 → 3 → … → 99
- 每次加1,共循环100次
- cnt 最终为100
- 修改后
i += i + 1
:- i 的变化过程:
- i = 0: 0 + (0 + 1) = 1
- i = 1: 1 + (1 + 1) = 3
- i = 3: 3 + (3 + 1) = 7
- i = 7: 7 + (7 + 1) = 15
- i = 15: 15 + (15 + 1) = 31
- i = 31: 31 + (31 + 1) = 63
- i = 63: 63 + (63 + 1) = 127
- i = 127: 127 + (127 + 1) = 255 > 200,循环结束
- 只执行7次循环就结束
- i 的变化过程:
因此修改后的代码输出结果明显不同。输出次数远小于 100,不相等。
第6题
交换下⾯C++代码中的 i += 2 和 cnt += 1 ,交换前后分别运⾏的两次输出相同。( )
1
2
3
4
5
6
7
int i, cnt = 0;
cnt = 0;
while (i < 10) {
i += 2;
cnt += 1;
}
cout << cnt;
答案: × 错误
📘 解析
分析代码执行过程:
- 原代码:
i
未初始化,值不确定cnt
初始化为 0- 进入循环:
i += 2
→i
值不确定cnt += 1
→cnt
值不确定
- 由于
i
初始值不确定,循环次数也不确定 - 最终输出的
cnt
值不确定
- 交换后代码:
i
未初始化,值不确定cnt
初始化为 0- 进入循环:
cnt += 1
→cnt
值不确定i += 2
→i
值不确定
- 由于
i
初始值不确定,循环次数也不确定 - 最终输出的
cnt
值不确定
由于 i
未初始化就使用,这是一个未定义行为。两种情况下的输出都是不确定的,且不一定相同。因此交换前后的输出不一定相同。
第7题
下⾯的C++代码执⾏后将输出45。( )
1
2
3
4
int cnt;
for (int i = 0; i < 10; i++)
cnt += 1;
cout << cnt;
答案: × 错误
📘 解析
- 未初始化
cnt
,直接累加 → 会导致未定义行为(垃圾值 + 1) - 若初始化为 0,则循环执行10次,
cnt
最终值为 10 - 题中说为 45,错误。
📌 知识点扩展
- C++ 变量使用前需初始化。
- 未初始化变量参与运算属于未定义行为(UB)。
第8题
执⾏C++代码 cout « (12 + 12.12) 将报错,因为12是int类型,⽽12.12是float类型,不同类型不能直接运算。( )
答案: × 错误
📘 解析
- 12 为
int
,12.12 为double
- 自动类型提升:
int → double
,可以加法运算 - 合法输出结果为
24.12
(实际可能是带精度误差的浮点数)
📌 知识点扩展
- 混合类型运算遵循自动类型转换规则。
- 常见提升路径:
int → float → double
第9题
在C++代码中,不可以将变量命名为false,因为false是C++语⾔的关键字。( )
答案: ✔ 正确
📘 解析
false
是布尔类型关键字,与true
相对。- 关键字不可作为变量名。
- 编译器会报错:尝试重定义关键字。
📌 知识点扩展
常见保留关键字如: int
, float
, if
, while
, return
, new
, class
, true
, false
等。
第10题
X是C++的整型变量,则表达式 3 < X < 5 求值结果是4。( )
答案: × 错误
📘 解析
表达式
3 < X < 5
实际按顺序计算:3 < X
→ 布尔值:0 或 1- 然后
0 < 5
或1 < 5
→ 恒为 true(即1)
应改为:
1
if (X > 3 && X < 5)
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲、真题讲解、知识拓展和练习清单等详见【置顶】【GESP】C++ 认证学习资源汇总
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助