ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GESP C++一级真题解析:从硬件常识到语法考点的复习主线

GESP C++一级真题解析:从硬件常识到语法考点的复习主线

简介:这份Word文档收录了2023年6月GESP C++一级考试真题,面向备考C++一级的考生及信奥赛初学者。资源共1个docx文件,压缩包仅71KB,轻便易用。内容包含完整的选择题、判断题和编程题,并针对选择题与判断题逐题给出知识点解析,覆盖计算机输出设备、ChatGPT应用范围、C++常量与变量、标识符规则、关键字识别、运算符优先级、模运算、逻辑表达式等高频考点;编程题部分对时间规划和累计相加两道题目给出了转换思路与样例演算,帮助考生理解如何将实际问题拆解为程序逻辑。目前已有1242人学习下载,适合考前自测、知识巩固与查漏补缺。通过研习这套真题,考生可快速熟悉正式考试的题型分布与难度,检验自身C++编程基础,为后续进阶学习铺平道路。

1. GESP C++一级全景图:一套真题串起的三层知识与复习主线

拿到这套 2023 年 6 月 GESP C++ 一级真题,第一反应往往是“题量不大、考点很散”——30 分单选、20 分判断、50 分编程,加起来不过 15 道小题加 2 道编程题。但把整卷摊开对照 C++ 一级考纲去梳理,会发现它其实只考三层东西:计算机基础常识、C++ 语言核心语法、简单顺序与循环逻辑的编程实现。这三层不是割裂的,而是层层递进的关系——第一层保证你能读懂题目里的硬件和 AI 常识,第二层决定你能不能选对表达式和语法题,第三层才是真正区分“背过语法”和“能写程序”的分水岭。这份笔记就是按这条主线把整卷拆开,再把每个模块里的高频考点、容易踩的坑和做题时可以用到的判断方法逐一整理出来。适合两类人:一类是正在准备一级考试、需要考前快速把知识框架收紧的考生,另一类是刚学完 C++ 语法、想用真题检验自己到底哪里没学透的初学者。

2. 硬件常识与语言地基:从设备分类到变量规则的常考面貌

2.1 三大设备分类:一道输出设备题背后的判定清单

单选第 1 题考查“不属于输出设备的是哪个”,这也是 GESP 一级卷里硬件题最常见的出法。四个选项里,麦克风、音箱、打印机、显示器,正确答案是麦克风。这类题本身不难,但容易在“麦克风到底是输入还是输出”上犯迷糊——因为它既能“发声”也能“收音”,很多人会被这种双向外表带偏。判断标准其实只有一条:看设备是向计算机输入信息,还是把计算机处理结果呈现给用户。麦克风采集声音进计算机,是输入设备;音箱、打印机、显示器都是把结果送出给人,属于输出设备。复习时建议把常见设备做一次归类:输入设备记键盘、鼠标、麦克风、扫描仪、摄像头;输出设备记显示器、音箱、打印机;既能输入又能输出的设备(如触摸屏、网卡)单列一类,考试时按选项逐个过一遍这个清单,基本不会翻车。这个分类习惯对第二道 AI 常识题也有帮助,因为它同样考查“设备/工具能做什么”的边界判断。

2.2 AI 应用边界与计算机历史:常识题不是白送分

单选第 2 题问 ChatGPT 不能完成哪项任务,答案是“擦地板”。改邮件、编剧本、写代码都属于文本生成与理解,AI 能做;擦地板是物理世界动作,超出能力边界。这道题本质不是考 AI 技术细节,而是考“语言模型能覆盖什么、不能覆盖什么”的常识判断。做题时只要抓住一个原则——凡是涉及实体物理操作的,基本都不在纯软件 AI 的能力范围内。备考时不需要背 ChatGPT 的发展史,但要把“AI 能做文本类任务、不能做物理类任务”这个判断意识建立起来,因为一级卷很可能会换皮考同类内容,比如换成“AI 不能完成的是:开车、翻译、写诗、做表格”中的“开车”。

判断第 2 题也属于常识题,说的是我国第一台通用数字电子计算机 103 机诞生于 1958 年,比 1946 年诞生的世界上第一台通用电子计算机 ENIAC 晚了十多年。1958 减 1946 是 12 年,说“十多年”没有问题,所以这题判对。这类时间线题目复习时不必死记硬背年份表,把“计算机诞生于 1946 年、我国第一台在 1958 年”这两条关键时间锚点记住就够了,万一考到其他机型,用“差不多晚十年”的间隔感去判断也能蒙对方向。

2.3 变量与赋值:D 选项背后的 C++ 类型语义

单选第 4 题是典型的“看着简单、细想容易绕”的变量概念题。四个选项分别说:变量可以没有定义、对未定义变量赋值相当于定义新变量、赋值后变量类型可能变化、赋值后变量值可能不会变化。正确答案是 D。很多初学者选 B,因为在 Python 里确实“赋值即定义”,但 C++ 不是这样——C++ 要求变量先声明类型再使用,对一个没定义的标识符赋值是编译错误,不是“自动定义”。选 C 的人则是把静态类型语言和动态类型语言的规则混在一起了。C++ 变量的类型在声明时被固定,后续赋值永远不可能改变它的类型,int 变量赋 5.5 会截断成整数,但类型还是 int。至于 D 选项“值可能不变”,指的是赋值语句可能把相同的值赋回去,比如 a = a; 或 a = 5; 且 a 原本就是 5,这在语义上完全合法。复习这个考点要建立三条底线:变量必须先定义后使用、类型由声明决定且不会因赋值改变、赋值是“把右侧值拷入左侧变量的存储空间”。

2.4 标识符与关键字:合法命名的三层过滤法

单选第 5 题和第 6 题都在考命名规则,一个是“哪个可以作为标识符”,另一个是“哪个不是关键字”。第 5 题正确答案是 A(number_of_Chinese_people_in_millions),360AntiVirus 以数字开头、Man&Woman 含 & 符号、break 是关键字,三个都不合法。第 6 题问的不是关键字的是 endl,因为 endl 是 iostream 头文件里预定义的一个输出流控制对象,不是 C++ 语言本身保留的单词。这里最容易被忽略的是“关键字列表和标准库名字的区分”——double、else、while 都是语言层面保留的,而 endl、cout、cin 这些是标准库提供的名字,程序里可以自定义一个叫 cout 的变量(虽然不推荐),但不能用 int 当变量名。

判断第 4 题也落在标识符规则上:题目说“标识符的命名不能完全由数字组成,至少有一个字母就可以”,后半句是错的。C++ 标识符的合法字符是字母、数字和下划线,且首字符不能是数字,所以“至少有一个字母”不是充分条件,下划线开头的标识符(如 _name)是合法的,像 123abc 这种既有字母又以数字开头的照样非法。复习时把标识符规则压缩成三层过滤法:第一层查首字符是不是数字,第二层查每个字符是不是字母/数字/下划线,第三层查整个单词是不是关键字。三层都通过才算合法,这套流程能应对选择题里所有标识符变体。

2.5 常量与数据类型:char、int、double 的区分线

单选第 3 题问常量 '3' 的数据类型,答案是 char。这里有个非常典型的混淆点:3 是 int,'3' 是 char,"3" 是字符串,三种写法在 C++ 里分属不同类型。单引号包住单个字符是字符常量,双引号包住的是字符串字面量(类型是 const char 数组),不带引号的数字才是整数或浮点常量。判断第 5 题说“10 是一个 int 类型常量”,这个说法成立,因为整数常量默认就是 int。

准备这一块时不要只背结论,要能把四个选项放一起比较。double 和 float 的差别在精度和存储位数,char 存的是字符编码(通常是 ASCII),int 存整数。做题时只要看到单引号,第一反应就应该是 char,这个反射练熟了,相关题目都能秒选。

3. 表达式运算与语法正误:单选后半段的失分重灾区

3.1 算术优先级与整除:一道混合表达式题的完整拆解

单选第 9 题计算 (4 * (11 + 12) / 4),看表面是小学算术,实际在考两件事:括号优先级和整数除法截断。按优先级先算括号内 11 + 12 = 23,然后从左到右 4 * 23 = 92,92 / 4 = 23,答案 C。这题唯一可能出错的地方是有人在 92/4 这一步纠结“会不会算出 23.0”,不会——因为参与运算的 92 和 4 都是 int,整数除法结果还是 int,直接截断小数部分。

判断第 10 题考得更直接:表达式 (37 / 4) 的计算结果是 9 且结果类型为 int。37 除以 4 商 9 余 1,整数除法丢掉余数,类型是 int,这题判对。但要注意:如果写的是 37.0 / 4,结果就是 9.25 的 double 类型。复习时把这个对比记牢:整数除法的关键不是“能不能整除”,而是“只要两个操作数都是整数,结果就一定是整数,小数部分直接丢弃”。这也是单选题第 12 题的考点来源。

3.2 类型提升与浮点结果:3.5 是怎么算出来的

单选第 12 题问四个表达式中哪个结果不是 3.5,a 和 b 是 int,值分别是 7 和 2。四个选项分别是:

0.0 + a / b // 先算 a/b=3,再算 0.0+3=3.0 (a + 0.0) / b // a提升为double,7.0/2=3.5 (0.0 + a) / b // 同上,3.5 a / (0.0 + b) // 分母变double,7/2.0=3.5

答案选 A。这里最关键的知识点是算术转换规则:当 int 和 double 混合运算时,int 会先被提升为 double,再做浮点除法;但运算符优先级决定了提升发生的时机。A 选项里 a / b 先结合,两个 int 相除产生 int 结果 3,然后 0.0 + 3 才提升为 3.0,整个过程丢了 0.5。其他三个选项里,0.0 或 int 变量的提升发生在除法之前,所以能保留小数部分。复习这个考点时,脑子里要有一条固定流水线:先按优先级确定哪些操作数先参与运算,再判断每个运算符两侧的类型,最后才决定结果类型。千万不要看到“表达式中有一个 double”就直接断定结果是 double,必须看它和谁先结合。

3.3 自反赋值与求余:a %= 4 的语义还原

单选第 10 题考复合赋值运算符:a 初始为 6,执行 a %= 4 后 a 的值是多少,答案是 2。复合赋值语句 a %= 4 等价于 a = a % 4,即 6 % 4 = 2。它的核心语义分两步:先算右侧表达式的值,再赋值回左侧变量。与之配套的常见变体还有 +=、-=、*=、/=,优先级和结合性都和赋值运算符一致(右结合)。这题不容易错,但它是后面判断第 9 题的铺垫——判断偶数要用 %、判断倍数也要用 %,复合赋值只是换了一层写法。

3.4 比较运算与逻辑运算:相等判断的三种错误写法

单选第 11 题问哪个表达式能正确判断“a 等于 0 且 b 等于 0”,正确答案是 B:!(a || b)。四个选项体现了三种典型误解。

(a == b == 0) // 从左到右结合,变成 (a==b) 的结果再 ==0,语义完全变了 !(a || b) // a或b任一非零时 ! 后为 false,只有都为0才 true (a + b == 0) // a=2,b=-2时也成立,无法排除正负抵消 (a == 0) + (b == 0) // 结果是整数,不是bool,可被隐式转换但不规范

A 选项是最隐蔽的坑:C++ 里比较运算符是左结合的,a == b == 0 会先算 a == b 得到一个 bool 值,再用这个 bool 值和 0 比较。如果 a、b 不相等,a == b 为 false(即 0),0 == 0 反而成立,完全颠倒。C 选项的“和为 0”只能说明两数互为相反数,说明不了各自为 0。D 选项虽然逻辑上能等价(两个 bool 相加为 0 时确实都非真),但类型是 int,属于“能跑但语义不清晰”的写法。复习这个考点要记住:判断两个条件同时成立首选 &&,等价写法是 !(a || b),不要用==的链式比较。

3.5 表达式不能用于面积计算:^ 不是乘方的冷知识

单选第 8 题问哪个表达式不能计算正方形面积,答案是 C:a ^ 2。在数学里 ^ 表示乘方,但在 C++ 里 ^ 是按位异或运算符,a ^ 2 是把 a 的二进制和 2 逐位异或,和面积毫无关系。这是 C++ 初学者从数学符号迁移到编程语言时最容易踩的坑。A 选项 a * a 是标准写法,B 选项 1 * a * a 乘了个 1 不影响结果,D 选项 a * 2 * a / 2 先算 a2a 再除以 2,由于是整数运算且能整除,结果也等于 a²。这一题暴露的问题是:很多学习者遇到“幂运算”第一反应是找 ^ 符号,而 C++ 里根本没有内置的幂运算符,要么写成连乘,要么调用 pow 函数。做题时凡是看到 ^,条件反射就应该是“这是异或,不是乘方”。

3.6 语法正误判断:赋值表达式与类型不匹配的识别清单

单选第 7 题是整卷里最典型的语法判断题,四个语句中不符合 C++ 语法的是 D:a + c = b + c。这条语句的问题在于赋值号左侧必须是可修改的左值(lvalue),而 a + c 是一个表达式结果,没有可寻址的存储位置,不能作为赋值目标。A 选项 a = (b == c) 是合法的——b == c 的结果是 bool 值,会被隐式转换为 0 或 1 赋给 int 变量。B 选项 b = 5.5 也合法但会截断,b 变成 5,这不是语法错误,是精度丢失。C 选项是同类型变量相加赋值,没有问题。

判断第 8 题也在考同样的边界:a = b 是赋值不是判断相等,所以“用表达式 a = b 判断 a 和 b 是否相等”是错的。这里要区分两个层面:语法上 a = b 合法,语义上它是把 b 的值赋给 a,整个表达式的值是赋值后的 a,用它做判断条件时只要 b 非零就为真。正确写法是 a == b。复习语法判断题时,只需要守住三条红线:赋值左侧必须是变量或可写对象、不能把浮点直接塞给整型变量而不接受截断的事实、复合赋值必须先理解展开后的形式。

4. 易漏点与易错点:一级考生最常见的五个忽略项

4.1 易漏点:循环步长与输出条件混在一起

单选第 14 题要求填一个空,使输出为“147”。题目给出的选项里有 i % 2 == 1、i % 3 == 1、i = i + 3、i + 3。一些人会在 A 和 B 之间犹豫,因为“奇数”和“余 1”看起来都和 1、4、7 沾边,但真正的考点是:1、4、7 是每次加 3 得到的序列,不是某个取模条件筛出来的。选 C(i = i + 3)才能让循环变量按 +3 步进。这个题暴露的问题是:很多人拿到“输出一串数”的题目第一反应是“筛选符合条件的数”,而忽略了还有“按步长生成序列”这条更直接的路径。建议复习时把两种题并排对比:筛选题看条件判断,生成题看步长修改,先判断题目意图再动手选。

4.2 易漏点:题干信息不全的题目不敢处理

单选第 13 题和第 15 题在原卷里存在题干不完整的情况——第 13 题只给了输出目标“20 10”,没给完整代码上下文;第 15 题只有选项没有程序文本。很多备考者遇到这种残题会直接跳过,或者强行猜一个答案,这其实是备考资源的正常现象。正确做法是:把第 13 题当作“交换两个变量并输出”的常规题去复习,这类题的标准逻辑是借助临时变量或直接按目标顺序输出;第 15 题既然没有程序,就不必纠结具体输出是什么,把它当作“循环累加类题目的结果预测练习”去补。做真题时遇到缺信息,记录下“这题哪个环节缺失”,比硬选一个答案更有价值。

4.3 易错点:整数除法与浮点除法的边界判断靠“先结合”而不是“看全局”

这是整套卷子里失分最密集的区域,单选第 12 题就是最好的例证。核心原因是人在读一个混合类型表达式时,习惯性先看“有没有小数”,而忘了运算符优先级决定了哪些操作数先结合。a / b 在没遇到 0.0 之前就已经算出 3 了,后面再提升也没用。补强方法是从现在起每道表达式题都强制画三步:圈出先结合的运算符、标出每个子表达式两侧的操作数类型、写出子表达式结果的类型。这样虽然慢,但能一次性把所有类型转换考点串起来。

4.4 易错点:赋值与比较的语法形式混淆

判断第 8 题说“a = b 可以判断 a 和 b 是否相等”,这句话是错的,但很多人第一眼觉得“好像也没什么问题”,因为读起来像“等于”。根源在于中文里“等于”和“赋值”都用同一个词,而 C++ 里 = 和 == 是两个完全不同的运算符。这个错误一旦在编程题里出现,就会变成逻辑 bug。复习时建议在草稿纸上写两组对照:a = b 表示“把 b 存入 a”,表达式的值是 a 的新值;a == b 表示“比较 a 和 b”,结果是 true 或 false。每次写判断条件前,心里默念一遍这个对照,能少踩很多隐蔽的坑。

4.5 易漏点:do…while 与 if 子句的存在性判断

判断第 6、7 题分别说“if 语句可以没有 else 子句”“do…while 循环体至少执行一次”,都属于流程控制的基本性质题。第 6 题判对,第 7 题也判对。容易被忽略的是 do…while 的分号:do…while 的结尾必须带分号,而 while 循环不需要。考试不会直接考“分号在哪里”,但编程题里漏写 do…while 末尾分号会造成编译错误。建议把三种循环的语法骨架各默写一遍,do…while 重点标记尾部分号,并把“至少执行一次”和“先判断后执行”的对比记清楚。

5. 复习清单与最后冲线:用这套真题做查漏补缺的五个动作

考前一天或考前三天,不建议再逐题重刷,而是按这张表快速过一遍自己的掌握状态:

知识模块对应题号自测标准
硬件设备分类单选1、判断1能说出常见输入/输出设备各 3 个
常识判断题单选2、判断2能解释为什么物理操作不在 AI 能力内
常量与类型单选3、判断5能区分 3、'3'、"3"
变量与赋值单选4能说清“赋值不改变类型”的机制
标识符与关键字单选5、单选6、判断4能在 10 秒内完成三层合法性过滤
表达式与优先级单选7~12、判断8~10能画出混合表达式的运算顺序
循环与步长单选14、判断6、判断7能解释 do…while 至少执行一次的原因
编程实现编程1、编程2能独立写出完整代码并跑通样例

两个编程题是复习的重头。时间规划题的核心是统一单位:把小时和分钟都换算成分钟再相减。累计相加题,从样例可以反推规律——n=3 输出 10,n=4 输出 20,n=10 输出 220,它其实是前 n 个“1 到 i 的累加和”再求和。参考实现如下:

#include <iostream> using namespace std; int main() { int n; cin >> n; long long ans = 0; for (int i = 1; i <= n; i++) { long long sum = 0; // 每次重新计算 1 加到 i 的和 for (int j = 1; j <= i; j++) { sum += j; } ans += sum; // 把第 i 项累加到总结果 } cout << ans << endl; return 0; }

这段代码用双层循环累加,i 控制层数,j 控制每层内部从 1 加到 i。n 最大 100,两层循环的总计算量级别很小,不需要优化。要注意的是 ans 建议用 long long,因为 n=100 时结果已经超过 16 万,虽然 int 也能装下,但养成用更大容量的习惯能避免高阶题目里的溢出问题。时间规划题则固定两个换算:开始总分钟 = 小时×60 + 分钟,结束总分钟 = 小时×60 + 分钟,两者直接相减即可,因为题目保证了同一天且开始早于结束,不需要处理跨天借位。

我自己的习惯是:每次拿到一套真题,先不看解析把单选判断做完,再对照解析把错题对应的知识模块标出来,最后只针对标出的模块重看一遍语法笔记。这套流程走完再去碰编程题,会明显感觉顺畅很多——因为表达式和语法坑在前半张卷子里已经暴露干净了,剩下的精力可以全部放在算法思路上。从那以后,我做任何一套真题前都会强制先画一遍“考点分布表”,把题目序号填进知识模块,再决定当天复习什么。这个方法看着笨,但对查漏补缺真的有效。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进