很多同学在顺利通过 GESP 一级后,会觉得二级只是多学了几个单词(if, for, while),应该很简单。
但根据 CCF 官方的统计数据和考场表现来看,二级是很多孩子遇到的第一个“拦路虎”。为什么?因为从一级到二级,编程思维发生了一个质的飞跃:从“按顺序执行”变成了“按逻辑执行”。
GESP 二级要求考生熟练掌握关系与逻辑运算、多重分支结构、各种循环结构以及嵌套循环。代码不再是从第一行跑到最后一行,而是会在中间跳跃、重复、判断。
今天,我们从 AdaCpp 的 GESP 真题库中精选了 5 道最具代表性的二级真题,带大家拆解其中的逻辑陷阱。
01 逻辑运算符的优先级陷阱
在二级的选择题中,逻辑表达式的计算是必考题。很多同学容易混淆 &&(与)、||(或)和 !(非)的运算顺序。

【真题重现】
若变量 a = 5, b = 10, c = 20,则表达式 (a > b) || (b < c && a < c) 的值是?
A. true
B. false
C. 10
D. 20
【深度解析】
这道题考查的是逻辑运算符的优先级:! > && > ||。
1.首先看括号内的比较:
●a > b (5 > 10) 为 false
●b < c (10 < 20) 为 true
●a < c (5 < 20) 为 true
2.原式变为:false || (true && true)
3.根据优先级,先算 &&:true && true 结果为 true
4.最后算 ||:false || true 结果为 true
答案:A
备考干货:在 C++ 中, true对应的数值是 1,false对应的是 0。如果题目问数值,要能够灵活转换。
02 switch-case 的“穿透”现象
分支结构除了 if-else,switch-case 也是二级大纲的重点,而这里最大的坑就是 break 语句。
【真题重现】
阅读以下代码,输出结果是多少?
int x = 2;
switch (x) {
case 1: cout << "A";
case 2: cout << "B";
case 3: cout << "C"; break;
default: cout << "D";
}【深度解析】
很多同学看到 x=2,匹配到 case 2,输出了 "B" 就结束了。错!
switch 语句中,如果匹配到的 case 后面没有 break,程序会继续执行下一个 case 的代码,直到遇到 break 或 switch 结束。这叫做“穿透”现象。
1.x=2,跳转到 case 2,执行 cout << "B".
2.case 2 没有 break,程序继续向下执行 case 3。
3.执行 cout << "C".
4.遇到 break,跳出 switch。
正确输出:BC
03 循环中的“差一错误” (Off-by-one)
循环结构(for/while)是二级的核心。最容易丢分的地方不是循环体怎么写,而是循环多少次。
【真题重现】
计算 1 到 100(含)之间所有偶数的和。
int sum = 0;
for (int i = 1; i < 100; i++) {
if (i % 2 == 0) {
sum += i;
}
}
cout << sum;这段代码能得到正确结果吗?
【深度解析】
不能。题目要求是 1 到 100 (含)。
代码中的条件是 i < 100,这意味着当 i 变成 100 时,循环条件不满足,循环终止。因此,100 这个偶数没有被加进 sum 中。
这是典型的“差一错误”。正确的写法应该是 i <= 100。
AdaCpp 学习建议:在 AdaCpp 的在线 IDE 中,你可以输入这段代码并运行。如果结果不对,可以使用我们的 AI 智能助手功能。选中代码,点击“解释代码”或“查找Bug”,AI 会明确告诉你循环边界的问题,并给出修复后的代码。对于初学者来说,这种即时反馈能极大地加深对逻辑的理解。
04 嵌套循环与图形打印
二级考试中最后两道编程题,往往有一道是图形打印或简单的数学规律题,这通常需要用到双层循环。
【真题重现】
输入一个整数 n,输出 n 行的直角三角形。例如 n=3 时输出:
*
**
***【解题思路】
这需要两层循环:
●外层循环控制行数(从第 1 行到第 n 行)。
●内层循环控制每一行打印的星号数量。
●观察规律:第 i 行有 i 个星号。
【参考代码】
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) { // 外层循环控制行
for (int j = 1; j <= i; j++) { // 内层循环控制列
cout << "*";
}
cout << endl; // 每打完一行要换行
}
return 0;
}易错点:忘记在内层循环结束后输出 endl 进行换行,导致所有星号挤在一行。
05 简单数学逻辑:数位分离
虽然二级不考复杂的数论,但“水仙花数”、“回文数”等需要拆解整数各位数字的题目属于简单计算范畴,是二级的高频考点。
【真题重现】
输入一个三位数,输出它个位、十位、百位数字之和。
【深度解析】
这道题考查对取模运算(%)和整数除法(/)的综合运用。
假设输入数字为 n:
1.个位:n % 10 (例如 123 % 10 = 3)
2.十位:(n / 10) % 10 (例如 123 / 10 = 12,12 % 10 = 2)
3.百位:n / 100 (例如 123 / 100 = 1,因为是整数除法)
很多同学在处理十位时,容易写成 n % 100,这会得到 23 而不是 2,导致计算错误。
总结与备考建议
GESP 二级考试虽然没有复杂的算法,但对逻辑的严密性要求很高。break 漏写、循环边界搞错、整数除法精度丢失,这些细节往往决定了是 90 分还是 59 分。
如何高效备考?
1.多动手写代码:光看书是不够的,必须亲自敲代码,观察程序的运行结果。
2.利用工具纠错:推荐使用 AdaCpp 平台进行练习。
●零门槛环境:打开浏览器就能写 C++,不需要花几个小时去配置复杂的编译器环境。
●L1入门基础课程:我们的 L1 课程完整覆盖了 GESP 1-2 级的所有知识点,从变量到循环嵌套,都有系统的视频讲解和配套练习。
●海量真题库:AdaCpp 收录了从 2023 年至今的 78 套 GESP 真题。你可以在线刷题,系统会自动判题。如果做错了,AI 助手会像真人老师一样,一步步引导你发现逻辑漏洞,而不是直接丢给你一个答案。
距离下一次 GESP 考试越来越近了,希望大家都能避开这些逻辑陷阱,顺利通关!

关注【AdaCpp】公众号
回复 “GESP” 获取最新考试大纲与备考白皮书
回复 “真题” 免费体验 GESP 在线真题测评
让 AI 陪你快乐学编程,轻松拿证书!