GESP 2026年6月 C++ 一级真题解析
- 2026-11-12 19:18:38
机器人编程课堂 | GESP 真题讲解 | 2026年6月卷
真题讲解系列,C++ 场。之前讲过 9 月的 C++ 一级,这次讲 6 月的。
老规矩:原卷的代码、选项原样搬过来,你看题的样子,就跟翻开原卷一样。
先看试卷结构:单选 15 题,每题 2 分;判断 10 题,每题 2 分;编程 2 题,各 25 分。
官方答案表(原卷第 1 页):
判断题答案(原卷第 5 页答案表,截图如下):√ √ × × √ √ × × × ×

先把一个有意思的事摆在这:把 6 月的 C++ 卷和 Python 卷放在一起看,前 12 道单选题几乎是逐题对应的——湿度传感器、编辑器操作、3 + 3.5、- 2 * 2、a = 3; b = a、输入 2026-6-27、比较大小、cnt =+ 1、循环序列、continue、试除找因子、while 条件。同一套题出了两个语言版。
有意思的地方在于:题目一样,答案却不全一样。哪些地方不一样、为什么不一样,恰恰是两种语言差异的核心。往下看,我会把对应关系点出来。
01一、单选题
02第1题
学校组织到未来农场参观,小明听讲解员介绍,在智能温室中,湿度传感器可以连续检测土壤的湿度变化,并将检测到的湿度数据实时发送给中央控制器。中央控制器根据这些数据判断是否开启灌溉系统。请问,这里的湿度传感器所发挥的作用,类似于计算机系统中的哪一类组件?
A. 处理器
B. 存储器
C. 输入设备
D. 输出设备
答案:C。
和 Python 卷第 1 题一字不差。传感器感知进来,输入设备。三场考试(6 月图形化、6 月 Python、6 月 C++)第一题全是它。
03第2题
在使用某集成开发环境(比如 Dev-C++)来编辑源代码文件时,程序员经常需要在编辑区中对代码进行各种修改。以下关于在编辑区中执行的操作描述不正确的是( )。
A. 可以将变量名 count 统一修改为 number
B. 可以连续撤销最近 2 次输入的内容
C. 可以调整代码行的缩进(如按 Tab 键)
D. 在注释文本中间不能混用中英文
答案:D。
跟 Python 卷第 2 题同款,只是 IDE 从 IDLE、PyCharm 换成了 Dev-C++。注释里混用中英文完全没问题,D 与事实相反。
04第3题
有关如下 C++ 代码的说法,正确的是( )。
float a = 3 + 3.5;cout << a;A. 代码执行将报错。如果将 a = 3 + 3.5 改为 a = 3 + 3 + 1/2 将能正常执行。
B. 代码执行将报错。如果将 a = 3 + 3.5 改为 a = 3.0 + 3.5 将能正常执行。
C. 代码能正常执行,将输出 6。
D. 代码能正常执行,将输出 6.5。
答案:D。
对应 Python 卷第 3 题,但结论要重新推:Python 里 3 + 3.5 自动升级成浮点数 6.5;C++ 里 3 + 3.5 同样按浮点算得 6.5,存进 float 再输出 6.5。选 D。
A 选项顺带考了整数除法:3 + 3 + 1/2 里,1/2 是整数除以整数,得 0,加出来是 6——就算改成这样,输出的也是 6 不是 6.5,何况原式本来就不报错。
05第4题
下列 C++ 表达式与 - 2 * 2 % 4 的值不同的是( )。
A. - (2 * 2) % 4
B. (- 2 * 2) % 4
C. - 2 * (2 % 4)
D. (2 * 2) % - 4
答案:C。
对应 Python 卷第 4 题,但把乘方换成了取余。原式:乘法取余同级,从左往右算,(-2) * 2 = -4,-4 % 4 = 0。
A:-(22) % 4 = -4 % 4 = 0,同。B:(-22) % 4 = 0,同。D:4 % -4 = 0(C++ 里余数的符号跟着被除数走,4 正好被 -4 整除,余 0),同。C:-2 (2 % 4) = -2 2 = -4,不同,选 C。
注意这题在 Python 里如果照搬会翻车:Python 的取余结果符号跟除数走,-4 % 4 虽然也是 0,但换成 -4 % 3 这类就会两边不一样。语言不同,取余规则要分开记。
06第5题
执行如下 C++ 代码片段,其输出是( )。
int a = 3;int b = a;a = 4;printf("%d %d", a, b);A. 3 3
B. 4 3
C. 4 4
D. 3 4
答案:B。
和 Python 卷第 5 题同款:赋值是复印不是遥控,b 抄下 3 之后就跟 a 断开联系。输出 4 3。
07第6题
如下 C++ 代码执行时输入 2026-6-27,下列说法正确的是( )。
int N;cin >> N;cout << N;A. 输入失败,不允许输入减号,没有输出
B. 允许输入,输出 1993
C. 允许输入并原样输出 2026-6-27
D. 允许输入并输出 2026
答案:D。
这里跟 Python 卷第 6 题分道扬镳了。Python 的 input() 把 2026-6-27 整串当字符串收进来,原样输出;C++ 的 N 是 int,cin 用 >> 读整数时,读到 2026 就停——减号不是数字的一部分,后面的 -6-27 留在缓冲区里没人管。所以输出 2026,选 D。
一道题看两种语言读入的本质差别:Python 收字符串,C++ 按变量类型解析。这个差别到了做编程题读数据的时候,天天要用。
08第7题
如下 C++ 代码执行时,其说法错误的是( )。
int N, M;cin >> N >> M;if (N > M) cout << "A " << (N - M);else cout << "B " << (M - N);A. 如果输入 4 3,将输出 A 1
B. 如果输入 3 4,将输出 B 1
C. 如果输入 3 3,将输出 A 0
D. 如果输入 4 4,将输出 B 0
答案:C。
跟 Python 卷第 7 题同款同答案:3 > 3 不成立,走 else 输出 B 0,C 说输出 A 0,错。大于就是大于,不含等于。
09第8题
阅读如下 C++ 代码,下列说法错误的是( )。
int cnt = 0;for (int i = 0; i < 5; i++) cnt += 1;cout << cnt;A. 将 cnt += 1 修改为 cnt = cnt + 1,执行效果相同
B. 将 cnt += 1 修改为 cnt = 1 + cnt,执行效果相同
C. 将 cnt += 1 修改为 cnt =+ 1,执行效果相同
D. 将 cnt += 1 修改为 cnt = + 1 + cnt,执行效果相同
答案:C。
跟 Python 卷第 8 题同款同答案:cnt =+ 1 是把正 1 赋给 cnt,每轮重置,五轮之后还是 1。C++ 和 Python 在这个坑上态度一致。
10第9题
如下 C++ 代码执行后输出是 1 2 3 4 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7。横线处应该先后依次填入的运算符是( )。
int num = 1;for (int i = 0; i < 35; i++) { printf("%d ", num); if (num _______ 10) num _______ 2; else num _______ 1;}A. > /= +=
B. >= %= +=
C. > %= +=
D. > /= =+
答案:A。
跟 Python 卷第 9 题同一个数列。11 之后跳回 5:C++ 的 int 除法 11 / 2 = 5(直接砍小数),所以是 /=;触发条件是 11 > 10,所以是 >。选 A。
B 的 >= 会让 10 也被砍半;C 的 %= 是取余,11 % 2 = 1,数列全乱;D 的 =+ 是赋值 1。跟 Python 卷互为镜像,连错误选项的套路都一样。
11第10题
如下 C++ 代码可以执行,其输出是( )。
int i;for (i = 1; i < 5; i++) if (i % 2 == 0) { continue; cout << i << "#"; }cout << i << "END#";A. 5END#
B. 5#END
C. 1#3#4#END
D. 1#3#4 END#
答案:A。
这道题对应 Python 卷第 10 题,但结构动了手脚,答案也跟着变了。
看清楚:cout << i << "#" 写在 continue 的后面、if 的大括号里面。偶数轮:进 if,先撞上 continue,后面的输出永远执行不到;奇数轮:if 条件不成立,整个大括号跳过,输出也执行不到。所以循环一圈下来,一个字符都没打。
循环结束后 i 是 5(for 的 i 声明在外面,出了循环还活着),最后一行输出 5END#。选 A。
Python 版里 print 写在 if 外面,所以 1#、3# 都打出来了。同一考点,两句代码位置的差别,输出天差地别——对照着看,continue 和 continue 后面的死代码,就都吃透了。
12第11题
如下 C++ 代码执行时,下列说法正确的是( )。
int N, i;cin >> N;for (i = 2; i < N; i++) if (N % i == 0) { cout << "1#"; break; } else cout << "0#";A. 如果输入 2,将输出 1#。
B. 如果输入 15,将输出 0#1#。
C. 如果输入 1,将输出 0#。
D. 如果输入 3,将输出 1#。
答案:B。
跟 Python 卷第 11 题同款同答案。从 2 试到 N-1:不整除打 0#,第一个整除打 1# 然后 break。输入 15:i=2 打 0#,i=3 整除打 1# 收工,输出 0#1#,B 对。输入 2 或 1,循环范围是空的,什么都不输出;输入 3,只有 i=2 不整除,打 0# 结束。
这就是质数判断的雏形——下一题马上考它的边界。
13第12题
有关如下 C++ 代码,下列说法中错误的是( )。
int i, tot;i = 0, tot = 0;while (0 <= i && i < 10) { tot += 1; i += 1;}cout << tot;A. 如果调整 0 <= i && i < 10 为 1 <= i && i < 10,输出同样为 45,因为加上 0 不影响结果。
B. 如果将 i = 0 和 tot = 0 合并为 i = tot = 0,执行结果与修改前相同。
C. 将 tot += 1 与 i += 1 交换顺序,执行结果与修改前相同。
D. 将 i = 0 与 tot = 0 交换顺序,执行结果与修改前相同。
答案:A。
对应 Python 卷第 12 题,但注意代码变了:循环体里是 tot += 1,不是 tot += i!这段代码数的是循环次数,输出 10,压根不是 45。
A 错了两次:第一,改条件后 i=0 连循环都进不去,一次都不跑,tot 还是 0,输出 0;第二,就算进去了,数的是次数也不是 45。官方答案 A,双重的坑——先骗你以为算的是 0 到 9 的和,再骗你以为 while 条件改了不影响。
对照 Python 卷:那道题的循环体是 tot += i,加 0 确实不影响总和,但死在“i=0 进不了门”;这道题连“总和”都是假的。同一道题的两个语言版,坑中套坑。
B 的连续赋值 i = tot = 0(C++ 特性,Python 里是 i, tot = 0, 0)、C 的交换(数次数,先加后加都是 10 次)、D 的交换(都是 0,无所谓先后)都正确。
14第13题
以下 C++ 代码可以找出千位、百位、十位和个位满足特定条件的四位数(例如各位数字的四次方和等于原数,即“四叶玫瑰数”),横线处应该填入的是( )。
int count = 0;for (int n = 1000; n <= 9999; n++) { int a = n / 1000; int b = (n / 100) % 10; _________________________ // L1 int d = n % 10; if (a * a * a * a + b * b * b * b + c * c * c * c + d * d * d * d == n) { // 特定条件 count++; }}A. int c = (n / 10) / 10;
B. int c = (n / 10) % 10;
C. int c = (n % 10) / 10;
D. int c = (n % 10) % 10;
答案:B。
拆数位题。千位 n / 1000,百位先砍个位再取余 (n / 100) % 10,那么十位就是先砍掉个位再取余:(n / 10) % 10,选 B。个位 n % 10。
验证:n = 1234,n / 10 = 123,123 % 10 = 3,十位正确。A 的 (n/10)/10 是再砍一位,得到的是百位往左的数;C、D 在个位上打转。
这道题跟判断第 2 题((n / 10) % 10 与 (n % 100) / 10 是否相同)是同一族考点:拆数字靠 / 和 % 排队组合。
15第14题
下面的 C++ 代码用于计算经过 n 秒后的秒针位置(0-59),两处横线处分别应填入的代码是( )。
int start, n, pos;cout << "当前秒数(0-59): ";cin >> start;cout << "经过多少秒: ";cin >> n;pos = ____________; // L1if (____________) // L2 cout << n << "秒后回到12点方向" << endl;else cout << n << "秒后指向" << pos << "秒刻度" << endl;A. (start + n) / 60 和 pos == 0
B. (start + n) % 60 和 pos == 0
C. (start + n) / 60 和 pos <= 0
D. (start + n) % 60 和 pos = 0
答案:B。
秒针转圈,转过头要从 0 重新数——环形计数,取余:(start + n) % 60,L1 填 %。回到 12 点方向就是 pos == 0,L2 填 ==。
D 的 L1 对,但 L2 写成一个等号——pos = 0 是赋值,赋完的值是 0,条件永远为假,全部走 else。C++ 里 = 和 == 的这道经典坑,被官方正式出了题。这也是 C++ 卷跟 Python 卷最大的不同之一:Python 写 = 进 if 会直接报错拦住你,C++ 会一声不吭地跑错。
16第15题
如果正整数 N 只能被 1 和它本身整除,则它是一个质数(或素数)。下面的 C++ 代码用于判断正整数 N 是否为质数(素数)。若 N 是质数,输出 YES,否则输出 NO。横线处不应填入的代码是( )。
int N, i;cin >> N;if (N <= 1) { cout << "NO"; return 0;}for (i = 2; ______; i++) { if (N % i == 0) { cout << "NO"; return 0; }}cout << "YES";A. i < N
B. i <= N
C. i <= N / 2
D. i * i <= N
答案:B。
注意题目问的是“不应填入”。B 的 i <= N 会让循环试到 N 本身——N % N == 0 恒成立,任何数都会被打成 NO,连质数也跑不掉,所以 B 不应填。
另外三个都是对的:A 试到 N-1,最朴素但正确;C 试到 N/2,因为大于 N/2 的数不可能是 N 的因子(除了 N 自己,已经被排除了);D 试到根号 N,效率最高——因子是成对出现的,一个因子不超根号 N,另一个就不小于根号 N。
从上一题的“试除找因子”到这一题的“质数边界”,一级的循环考点闭环了。
17二、判断题
18第1题
又到期末考试周,小明发现这次许多闭卷考试不仅禁止携带手机、平板电脑,还有最近比较时髦的各类 AI 眼镜(也有叫智能眼镜)也同样不允许带入考场。这些 AI 眼镜应该也是内置了操作系统并可能支持 Wi-Fi 或蓝牙连接。
答案:√。
跟 Python 卷判断 1 一字不差。内置操作系统、能联网,就是一台计算机。答案 √。
19第2题
如果 n 为大于 100 的整数,则 C++ 表达式 (n / 10) % 10 与 (n % 100) / 10 的结果相同。
答案:√。
跟 Python 卷判断 2 同款:两条路算的都是十位。拿 123 验证:123 / 10 = 12,12 % 10 = 2;123 % 100 = 23,23 / 10 = 2。整数除法在这一点上 C++ 和 Python 的 // 行为一致。答案 √。
20第3题
下面 C++ 代码执行后将输出 19。
int i;for (i = 0; i < 20; i += 3) if (i % 3 != 0) break;cout << i;答案:×。
i 取 0、3、6、9、12、15、18,全是 3 的倍数,break 永远不触发,循环正常跑完。最后一轮 i = 18 走完循环体,i += 3 变成 21,才去检查 21 < 20,不成立,退出。输出 21,不是 19。
注意跟 Python 版的区别:Python 版循环体里有 print(i),能输出一串数;C++ 版只在循环外输出一次 i。考的不是一个东西,别拿上个月的答案硬套。答案 ×。
21第4题
在数学中,N! 称之为 N 的阶乘,其含义是 1 到 N 之积,包括 N。如 3! = 1 × 2 × 3 = 6。如下 C++ 代码能输出 N! 的结果。
int N;cout << "请输入正整数:";cin >> N;int rst = 0;for (int i = 1; i < N + 1; i++) rst *= i;cout << rst;答案:×。
跟 Python 卷判断 4 同款:rst 初始成 0,0 乘任何数都是 0。求连乘初始值必须是 1。答案 ×。
22第5题
如下 C++ 代码能实现输出正整数 N 的各位数字。
int N;cin >> N;while (N > 0) { cout << (N % 10) << endl; N = N / 10;}答案:√。
这里就是两种语言分道扬镳的地方了,必须单独说。
Python 卷的同款代码是 ×,因为 Python 的 / 是真除法,123 / 10 得 12.3,全盘皆输。而 C++ 里 N 是 int,N / 10 是整数除法,直接砍掉小数:123 / 10 = 12。所以这段代码在 C++ 里是对的:依次输出个位 3、十位 2、百位 1。答案 √。
同一段逻辑,Python 里错、C++ 里对——这是两张卷子对照着看最值钱的一道。记住结论:拆数字的“砍个位”,C++ 用 /,Python 用 //。
23第6题
将如下 C++ 代码中的 printf("\n") 更换为 printf("%c", '\n'),输出效果相同。
for (int i = 0; i < 100; i++) { if (i % 5 == 0) printf("\n"); printf("%2d ", i);}答案:√。
printf("\n") 直接输出换行符;printf("%c", '\n') 是用字符格式输出换行字符——同一个字符,两种给法,效果一样。答案 √。
24第7题
C++ 代码 cout << (2.5 % 2) 能够生成可执行代码,但执行时将报错,因为 % 只能适用于正整数。
答案:×。
两个错。第一,2.5 % 2 在 C++ 里编译就过不去——% 只能用于整数类型,根本“不能生成可执行代码”,而不是“执行时报错”。第二,% 的限制是“只能用于整数”,跟正负无关,负整数也能取余。答案 ×。
对照 Python 卷判断 7:2.5 % 2 在 Python 里合法,得 0.5。又是同一个表达式,两种语言两种命。
25第8题
下面的 C++ 代码执行后将输出 24。
int total;for (int n = 1; n <= 4; n++) { total *= n;}cout << total;答案:×。
total 声明时没给初值。C++ 的局部变量不初始化,里面的值是内存里残留的垃圾值——0 乘出 0,垃圾值乘出垃圾值,唯独不是确定的 24。
这题和 Python 卷判断 4(rst = 0 那道)凑成一对:Python 忘了初始化会直接报错拦住你,C++ 不报错,带着垃圾值一路狂奔。语言越自由,纪律越要自己给。答案 ×。
26第9题
如果 a 是 C++ 的整型变量,值为 4,则表达式 (a % 2 == 0) + (a / 2) 的值为 4。
答案:×。
(a % 2 == 0) 是比较,4 % 2 == 0 成立,结果是 true。参与算术运算时 true 当 1 用,所以是 1 + (4 / 2) = 1 + 2 = 3,不是 4。答案 ×。
考点两个:比较运算的结果是布尔值,算术里 true 当 1、false 当 0;整数除法 4 / 2 = 2。
27第10题
删除下面 C++ 代码中的 continue 后,其输出与原来相同。
int x = 0;while (x < 4) { x++; if (x == 2) continue; cout << x << ",";}答案:×。
原来:x=2 那一轮,continue 跳过输出,屏幕上是 1,3,4,。删掉 continue 之后,x=2 也会被输出,变成 1,2,3,4,。不同,答案 ×。
跟 Python 卷判断 10(printf 换写法那种“换个说法效果相同”)不同,这道考的是 continue 的实际作用:跳过本轮剩下的部分。上一题 Python 卷单选 10 刚考过 continue 的位置,这里换个皮再考一次。
28三、编程题
29编程题1:去旅行
试题名称:去旅行。时间限制 1.0 s,内存限制 512.0 MB。
题目描述:快暑假了,小杨同学正在计划出去旅行,前往目的地的方案多种多样,小杨同学想知道如何前往目的地最便宜。小杨同学住在 A 市,旅行目的地是 B 市,前往目的地有三种方案:
▪︎ 从 A 市直飞 B 市;
▪︎ 从 A 市坐高铁到 C 市,然后坐飞机到 B 市;
▪︎ 从 A 市坐高铁到 C 市,然后坐高铁到 B 市。
请帮小杨同学求出最便宜的出行方案的价格。
输入格式:输入包含 4 行,每行一个正整数,分别表示:A 市直飞 B 市的价格;A 市坐高铁到 C 市的价格;C 市坐飞机到 B 市的价格;C 市坐高铁到 B 市的价格。
输出格式:输出一个正整数,表示 3 种方式中,最便宜的出行方案的价格。
输入样例 1:
999105699588输出样例 1:
693样例解释 1:方案 1 直飞 999;方案 2 高铁转飞机 105 + 699 = 804;方案 3 全程高铁 105 + 588 = 693。最便宜 693。
输入样例 2:
9387输出样例 2:
9数据范围:所有输入均为正整数,且不超过 10000。
原卷参考程序:
#include <iostream>using namespace std;int main() { int a, b, c, d; cin >> a >> b >> c >> d; int x = a, y = b + c, z = b + d; if (x <= y && x <= z) cout << x; else if (y <= x && y <= z) cout << y; else cout << z; cout << endl; return 0;}跟 Python 卷的编程第一题完全同题,参考程序换了个写法:Python 版用打擂台,C++ 版用 if-else 链三个分支直接比。两种写法都对,考场上哪个顺手用哪个。
丢分点跟 Python 卷一样:方案 2、3 都含高铁 b,漏加必错;样例 2 提醒你直飞 9 元也可能最便宜,别想当然。C++ 版多一个格式细节:输出的正整数后面,参考程序跟了 endl,照着写不丢分。
30编程题2:交税
试题名称:交税。时间限制 1.0 s,内存限制 512.0 MB。
题目描述:根据国家税收相关规定,劳务报酬需要按月预交个税,预交税率如下:
▪︎ 劳务报酬不超过 800 的,不需要预交个税;
▪︎ 劳务报酬超过 800 的,仅超过 800 的部分按照 20%(即 0.2)税率预交个税(不超过 800 的部分不需要预交个税)。
例如,月劳务报酬为 1000.0,则按照规则 2 需要预交个税 (1000.0 − 800.0) × 20% = 40.00。
现在给定小杨同学 12 个月的月度劳务报酬,请帮小杨同学计算他这 12 个月应预交个税的总和。
输入格式:输入 12 行,每行一个浮点数,表示每个月的劳务报酬。每个浮点数恰好有一位小数。
输出格式:输出一行,一个浮点数,保留两位小数,表示 12 个月应预交个税的总和。
输入样例 1:
932.01634.31790.42172.9378.1283.42761.93583.510.12324.91111.63812.3输出样例 1:
2584.76以第一个月 932.0 为例:超过 800 的部分是 132.0,按 20% 预交 26.40;不到 800 的月份(如 378.1)一分钱不交。12 个月累加得 2584.76。
数据范围:每月劳务报酬收入均为正,且恰好有一位小数,且不超过 4000.0。
原卷参考程序:
#include <iostream>#include <cstdio>using namespace std;int main() { double ans = 0.0; for (int i = 0; i < 12; ++i) { double a; cin >> a; if (a <= 800.0) { ans += 0.0; } else { ans += (a - 800.0) * 0.2; } } printf("%.2f\n", ans); return 0;}同一道交税题,三件事跟 Python 版一模一样:判断用 <=(“不超过 800”含 800)、只对超出部分算 20%、输出保留两位小数。
C++ 版的特殊注意:金额用 double 存(cin >> a 直接读浮点);保留两位小数用的是 printf 的 %.2f——这也解释了参考程序为什么额外 include 了 cstdio。用 cout 也行,但要配合 fixed 和 setprecision(2),写起来更长,printf 一行搞定。
31四、这张卷子考什么
最后回答开头那个问题:同一套题,Python 和 C++ 的答案在哪儿不一样。
第一处,第 6 题:输入 2026-6-27,Python 的 input() 原样收下整串字符串,C++ 的 cin >> int 只读到 2026。读入机制不同。
第二处,判断第 5 题:N = N / 10 拆数字,Python 里 / 是真除法,代码是错的;C++ 里 int 整数除法自动砍小数,代码是对的。运算符行为不同。
第三处,判断第 7 题:2.5 % 2,Python 算出 0.5,C++ 直接编译报错。取余的适用范围不同。
第四处,单选第 12 题:同一个 while 陷阱,Python 版坑在“条件改了 i 还是 0”,C++ 版还要多骗一层——循环体是 tot += 1,你连“加的是什么”都得先看清楚。
把 6 月的这三张卷子(图形化、Python、C++)摆在一起看,GESP 一级的考点池就那么大,但同一考点能变出三副面孔。孩子刷题,刷的不是题量,是这些“面孔之间的对应关系”。
信息来源:CCF GESP 2026 年 6 月 C++ 一级真题(含官方答案表与参考程序)
对乐高、Scratch、Python、C++、AI感兴趣的小伙伴可以扫码进群
