文章

GESP一级C++考纲考点揭秘:深度分析12套真题,揭秘4大核心考点与通关秘籍| 适合所有初学者阅读

备战GESP(CCF编程能力等级认证)考试时,许多同学和家长常常感到焦虑:知识点繁多,不知从何下手;刷了很多题,却总感觉抓不住重点。这篇文章的目的,就是为了打消这种疑虑。

我在带孩子备考过程中,也自己刷了相关真题,发现其实很多考题逻辑有很多相似之处。通过分析从2023年3月到2025年12月的12套GESP C++一级真题,我提取总结了如下备考的核心逻辑,供大家参考。


1. 核心基石:无处不在的基础运算与优先级

分析所有真题后,我们发现最基础、最高频的考点,就是C++的基础算术运算及其优先级规则。几乎每套试卷的选择题部分都会有2-3道题直接考察这一点。可以说,GESP一级考试并非测试复杂的C++特性,而是严格评估你的基础计算思维。如果这部分知识不牢固,选择题部分将面临严峻挑战。

示例1:运算符优先级

题目来源:2025年12月-一级 (单选题 第5题)

C++表达式 2 + 3 * 4 % 5 的值为( )

考点解析:这道题直接考察了 * (乘法)、% (取余) 和 + (加法) 的优先级。在C++中,* 和 % 的优先级相同且高于 +。当优先级相同时,从左到右依次计算。

计算步骤:

  1. 3 * 4 结果为 12
  2. 12 % 5 结果为 2 (12除以5的余数)
  3. 2 + 2 结果为 4 因此,正确答案是 4。

示例2:括号改变优先级

题目来源:2023年12月-一级 (单选题 第2题)

C++表达式 10 - 3 * (2 + 1) % 10 的值是( )

考点解析:括号 () 拥有最高的运算优先级。无论括号外是什么运算,都必须先计算括号内的表达式。

计算步骤:

  1. (2 + 1) 结果为 3
  2. 3 * 3 结果为 9
  3. 9 % 10 结果为 9
  4. 10 - 9 结果为 1 因此,正确答案是 1。

示例3:整数除法陷阱

题目来源:2024年12月-一级 (单选题 第5题)

在C++中,假设N为正整数2,则 cout « (N / 3 + N % 3) 将输出( )

考点解析:这道题包含一个非常关键的“陷阱”——整数除法。在C++中,两个整数相除,结果仍然是整数,小数部分会被直接舍弃(不是四舍五入)。例如,5 / 2 的结果是 2,而不是 2.5。

计算步骤:

  1. N / 3 即 2 / 3,由于是整数除法,结果为 0
  2. N % 3 即 2 % 3,结果为 2
  3. 0 + 2 结果为 2 因此,最终输出是 2。

注意:拿到任何含有表达式的选择题,不要心算!在草稿纸上一步一步写下计算过程,严格遵循‘先乘除后加减,括号最优先’的原则,是保证不丢分的唯一方法。


如果说基础运算是考验你是否能“算得对”,那么循环控制的陷阱则考验你是否能“想得全”。

2. 细节陷阱:循环控制中的“一字之差”

for 循环和 while 循环是GESP一级考试的重中之重,但题目往往不考察基础语法,而是通过循环条件、break、continue 等细节设置陷阱,考察你的逻辑严谨性。一个微小的差异就可能导致程序输出截然不同。

示例1:continue与break的陷阱

题目来源:2024年12月-一级 (单选题 第10题)

题目:下⾯C++代码执⾏后输出的是( )。

1
2
3
4
5
6
7
8
9
10
int N=0,i;
int tnt = 0;
for (i = 5; i < 100; i+=5){
    if (i % 2 == 0)
        continue;
    tnt += 1;
    if (i >= 50)
        break;
}
cout << tnt;

A. 10 B. 9 C. 6 D. 5

考点解析:这道题是非常经典的“流程陷阱”,正确答案是 C. 6

很多同学会因为看到 if (i >= 50) break; 就认为循环在 i=50 时结束。但请注意 continue 的位置!

  1. 偶数跳过:当 i 为偶数(10, 20, 30…)时,执行 continue。这意味着 直接跳过 后面所有的代码(包括 tnt+=1break 判断),直接进入下一轮循环。
  2. i=50时的特例:当 i 增加到 50 时,因为它也是偶数,所以执行 continue跳过了下面的 break 判断
  3. i=55时的终止:循环继续。当 i 变为 55 时,它是奇数,执行 tnt+=1(tnt变为6),然后遇到 if (i >= 50),条件成立,执行 break,循环这才终止。

计数过程:

  • i=5 (奇), tnt=1
  • i=10 (偶), continue
  • i=45 (奇), tnt=5
  • i=50 (偶), continue (陷阱!break没执行)
  • i=55 (奇), tnt=6 -> break!

所以最终 tnt 的值是 6。

示例2:终止循环的 break

题目来源:2025年9月-一级 (单选题 第10题)

题目:下⾯C++代码执⾏后输出是( )。

1
2
3
4
5
6
7
8
int i;
for (i = 1; i < 5; i++) {
    if (i % 3 == 0)
        break;
    printf("%d#", i);
}
if (i > 5)
    printf("END\n");

A. 1#2# B. 1#2#END C. 1#2 D. 1#2#3#4#END

考点解析:break 语句的作用是立即终止并跳出整个循环。

  • i = 1 时,1 % 3 != 0,输出 1#。
  • i = 2 时,2 % 3 != 0,输出 2#。
  • i = 3 时,3 % 3 == 0,if 条件成立,执行 break,循环立即终止。 因此,程序最终只会输出 1#2#。选A。

示例3:决定循环次数的边界条件

题目来源:2025年12月-一级 (判断题 第5题)

题目:下⾯C++代码执⾏后将输出 99 ,因为 i < 100 不包括100,而是到99。( )

1
2
3
4
int cnt = 0;
for (int i = 0; i < 100; i++)
    cnt += 1;
cout << cnt;

考点解析:这道题考察对循环条件的精确理解。循环条件 i < 100 意味着 i 的取值范围是从 0 到 99。可以这样想:从0数到99,你一共数了多少个数字?是100个。所以循环不多不少,正好执行100次。cnt的最终值就是100。题目说输出99,是典型的‘差一错误’陷阱。像 < 和 <= 的一字之差,直接决定了循环的次数和最终结果。

提示:看到循环题,第一反应就是用手指或笔在纸上模拟i的每一步变化,特别是break和continue出现时,要明确标出哪一步被跳过或终止。‘人肉调试’是识破循环陷阱的法宝。


掌握了运算和循环的细节后,GESP会进一步考察你是否能将这些砖瓦组合起来,理解代码的‘意图’。

3. 逻辑为王:读懂代码背后的“小算法”

除了语法细节,GESP一级考试更看重考生的逻辑思维能力。许多代码填空题和选择题,表面上是考察C++知识,实际上是检验你是否能读懂这段代码的目的,即它背后实现的“小算法”。

示例1:质数判断的逻辑

题目来源:2024年03月-一级 (单选题 第10题)

第 10 题 下⾯C++代码⽤于判断键盘输⼊的整数是否为质数。质数是只能被1和它本⾝整除的数。在横线处应填⼊代 码是( )。

1
2
3
4
5
6
7
8
9
10
11
int N;
cin >> N;
int cnt = 0;
for (int i = 1; i <= N; i++) {
    if ()
    cnt += 1;
}
if (cnt == 2)
    cout << "是质数";
else
    cout << "不是质数";

A. N % i B. N % i == 0 C. N / i == 0 D. N / i

考点解析:要填对这道题,关键不是语法,而是理解代码的意图。

  1. 读懂目标:代码最后通过 if(cnt == 2) 来判断是否为质数。
  2. 关联定义:质数的数学定义是“一个大于1的自然数,除了1和它自身以外不再有其他因数”。换句话说,质数恰好有两个因数。
  3. 反推逻辑:cnt 变量显然是在统计因数的个数。那么,填空处的代码就必须是“判断 i 是否为 N 的因数”的逻辑。
  4. 得出代码:在编程中,判断 i 能否整除 N 的标准写法就是 N % i == 0。选B。

示例2:找所有因数的逻辑

题目来源:2024年03月-一级 (编程题2 - “找因数”),详见(【GESP】C++一级真题(202403)luogu-B3953,找因数)

⼩ A 最近刚刚学习了因数的概念,具体来说,如果⼀个正整数 可以被另⼀个正整数 整除,那么我们就说 是 的因数。

请你帮忙写⼀个程序,从⼩到⼤输出正整数 的所有因数。

在上述编程题中,同样出现了要求“从⼩到⼤输出正整数 N 的所有因数”的任务。其核心逻辑与上面质数判断的例子完全一致:

1
2
3
4
5
for (int i = 1; i <= a; ++i) {
    if (a % i == 0) { // 如果 i 是 a 的因数
        cout << i << endl; // 就输出 i
    }
}

这个“遍历+取余判断”的核心逻辑,在GESP一级考试中反复出现,无论是选择题还是编程题,都是解决因数、倍数、奇偶性等问题的通用钥匙。

综上所述,GESP一级考试并非天马行空,其背后的“小算法”模型高度集中。无论是选择题、填空题还是编程题,都反复围绕着三大核心逻辑模式:“因数与倍数判断”(利用 %)、“数字拆解”(利用 /10 和 %10)以及“范围计数/求和”(利用 for 循环累加)。只要掌握了这三个基本功,就能看透大部分题目的本质。


4. “稳拿50分”:编程题的“固定模板”

最后的两道编程题共占50分,是决定最终成绩的关键。很多同学对此感到畏惧,但通过分析真题我们发现,一级考试的编程题难度并不高,不涉及复杂算法,并且呈现出高度重复的模式。掌握以下两种“固定模板”,就能轻松应对。

类型1:条件逻辑 (if/else if/else)

这类题目会给出一系列明确的规则,要求你根据不同的输入范围,执行不同的操作。本质上就是考察 if-else if-else 结构。

典型例题:“手机电量显示” (2025年12月-一级, 编程题2),详见:(【GESP】C++ 一级真题解析,[2025年12月,第十二次认证]第二题手机电量显示)

题目要求:

  • 电量 P <= 10,显示 R
  • 10 < P <= 20,显示 L
  • P > 20,显示 P 的数字

解题模板:

只要将题目描述的规则逐一翻译成 if-else 语句即可。

类型2:简单循环逻辑

这类题目要求你遍历一个数字范围,对其中的每个数字进行简单的判断(如是否为倍数、奇偶、取余等),然后进行计数、求和或直接输出。

典型例题:“小杨报数” (23年12月真题-一级),详见:(【GESP】C++一级真题练习(202312)luogu-B3922,小杨报数)

题目要求:从 1 到 n 报数,但跳过 m 的倍数。

解题模板:

核心就是一个 for 循环加一个 if 判断,结构非常固定。


通过对12套真题的深度剖析,GESP一级C++考试的轮廓已清晰可见。总结下来,可归结为四点:

  1. 掌握基础运算:牢记运算符优先级和整数除法特性。
  2. 洞察循环细节:精确理解循环条件,分清 break 与 continue。
  3. 理解代码逻辑:不仅要看懂语法,更要思考代码的“目的”。
  4. 熟悉编程模板:熟练运用 if-else 和简单循环来解决问题。

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权