1. GESP C++六级选择判断题通关指南
作为一名从零基础自学通过GESP六级的老考生,我深知选择判断题是很多同学的痛点。这部分题目看似简单,但往往暗藏玄机,考察的是对C++语法和数据结构概念的精准理解。今天我就把自己备考过程中总结的"避坑指南"和核心知识点分享给大家。
GESP六级的选择判断题主要集中在三个方向:C++语法细节(占比约40%)、数据结构基础(占比约30%)和简单算法逻辑(占比约30%)。其中最容易出错的就是那些看起来"明显正确"的选项,比如指针与引用的区别、const关键字的多种用法、树遍历的非递归实现等。接下来我会用真题拆解的方式,带大家逐个击破这些难点。
2. C++语法核心考点解析
2.1 指针与引用易错点
这是每场考试必考的内容,也是错误率最高的题型之一。看下面这道真题:
cpp复制int a = 10;
int *p = &a;
int &r = a;
*p = 20;
r = 30;
题目问最终a的值是多少?很多同学会选20,因为他们忽略了引用r本质上就是a的别名。这里有个实用技巧:遇到引用时,直接在脑中把引用变量替换成原变量名再读代码。
另一个常见陷阱是函数参数传递:
cpp复制void swap(int *a, int *b) {
int *temp = a;
a = b;
b = temp;
}
题目问这个函数能否实现交换功能?答案是不能,因为这里交换的只是指针副本。正确做法应该解引用操作:
cpp复制void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
2.2 const关键字的四种用法
const在C++中有多种使用场景,考试常考它们的区别:
- const常量:
const int MAX = 100; - 指向常量的指针:
const int *p = &var;(指针可变,指向的值不可变) - 常量指针:
int *const p = &var;(指针不可变,指向的值可变) - 指向常量的常量指针:
const int *const p = &var;
记忆口诀:"const在前值不变,const在后指针定"。我曾专门整理过这类题目的解题模板:
当题目出现const时,先看const修饰的是指针本身还是指向的数据,再结合指针操作判断合法性。
2.3 动态内存管理陷阱
new/delete和malloc/free的混用是常见考点。特别注意:
- new会调用构造函数,malloc不会
- new返回具体类型指针,malloc返回void*
- 数组new要用delete[]释放
真题示例:
cpp复制int *p = new int[10];
free(p); // 错误!应该用delete[]
这种题目往往伪装成内存泄漏相关的判断题,要特别注意释放方式是否匹配。
3. 数据结构重点突破
3.1 树的性质与遍历
树的定义判断题经常考察以下性质:
- n个节点的树有n-1条边
- 二叉树第i层最多有2^(i-1)个节点
- 高度为h的二叉树最多有2^h-1个节点
遍历方式要注意:
- 先序:根→左→右
- 中序:左→根→右
- 后序:左→右→根
真题案例:
cpp复制struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
};
问中序遍历的非递归实现是否需要栈结构?答案是肯定的,因为需要保存父节点信息以便回溯。这是很多同学会忽略的点。
3.2 图的表示方法
邻接矩阵和邻接表的比较是高频考点:
| 特性 | 邻接矩阵 | 邻接表 |
|---|---|---|
| 空间复杂度 | O(V²) | O(V+E) |
| 查询边是否存在 | O(1) | O(V) |
| 遍历所有邻边 | O(V) | O(degree) |
考试常考稀疏图适合用邻接表,稠密图适合用矩阵。我曾用这个表格对比法在考场上快速解决了好几道相关题目。
4. 算法逻辑精要
4.1 递归与分治
递归题目常考基线条件和递归条件的判断。例如这个真题:
cpp复制int func(int n) {
if (n <= 1) return 1;
return n * func(n - 1);
}
题目问当n=5时函数共调用多少次?答案是5次(包括初始调用)。这类题目建议画出调用树来辅助理解。
4.2 排序算法特性
各种排序算法的时空复杂度必须牢记:
| 算法 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|
| 冒泡排序 | O(n²) | O(1) | 稳定 |
| 快速排序 | O(nlogn) | O(logn) | 不稳定 |
| 归并排序 | O(nlogn) | O(n) | 稳定 |
| 堆排序 | O(nlogn) | O(1) | 不稳定 |
考试特别喜欢考稳定性的判断,记住"快选堆希不稳定"这个口诀(快速排序、选择排序、堆排序、希尔排序)。
5. 实战答题技巧
5.1 选择题排除法
遇到不确定的题目时,我总结了三步排除法:
- 先排除语法明显错误的选项
- 排除逻辑明显不合理的选项
- 在剩余选项中比较细微差别
例如这道题:
cpp复制const int *p;
int a = 10;
p = &a;
*p = 20; // 选项问这里是否合法
根据const修饰的是*p,可以立即排除允许修改的选项。
5.2 判断题常见陷阱
判断题最喜欢在这些地方设陷阱:
- 指针和引用的初始化(如空引用)
- 虚函数表的实现原理
- 模板特化的匹配顺序
- 异常处理的栈展开过程
我的应对策略是:遇到"绝对化"表述(如"一定"、"总是")要特别小心,很可能是错误的。
6. 备考资源推荐
最后分享下我个人整理的备考资料:
- 《C++ Primer》第5章(指针与引用)和第7章(类)
- 《算法导论》树与图的基础章节
- GESP官网的历年真题(重点做2019年后的新题型)
- 自己整理的错题本(记录容易混淆的知识点)
建议每天花1小时专门练习选择判断,重点不是做题量,而是搞懂每个选项背后的原理。我当初就是把每道错题都追根究底,最终在正式考试中选择判断部分拿到了满分。