GESP C++二级 2026 年 3 月真题详细解析

四季读书网 2 0
GESP C++二级 2026 年 3 月真题详细解析
本文为2026年3月GESP C++二级真题的逐题解析,所有考点均对应官方考纲要求,帮助大家梳理知识盲区,掌握解题技巧。结合免费GESP练题小程序快速帮你查漏补缺。
GESP C++二级 2026 年 3 月真题详细解析 第1张

───── ✨ 第1题 ✨ ─────

📖 题目

2026年春节联欢晚会上一个武术表演节目《武BOT》。节目中多个人形机器人会表演空翻,它们落地可能会有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备 ( )。 

A. 检测重心的重力传感器 

B. 预装的AI算法程序 

C. 接收动作指令的遥控器 

D. 拍摄其他机器人的摄像头

📌 大纲对应知识点:C++二级 计算机基础知识 - 计算机硬件组成 🎯 考查目标:考查计算机系统输入设备的概念,区分输入设备与软件/程序的不同功能。

📋 选项详解

选项
是否正确
详细解析
A. 检测重心的重力传感器
重力传感器可以将机器人的重心变化数据输入到系统中,属于典型的输入设备。
B. 预装的AI算法程序
✅ 正确选项
算法程序是计算机系统中的软件部分,用于处理输入数据,本身不属于硬件输入设备,符合题意。
C. 接收动作指令的遥控器
遥控器可以向机器人输入动作指令信号,属于输入设备。
D. 拍摄其他机器人的摄像头
摄像头可以采集周围环境和其他机器人的图像信息输入系统,属于输入设备。

⭐ 答案:B 📌 知识点:计算机硬件组成 - 输入设备

💡 解题小贴士:输入设备的核心功能是向计算机系统输入外部数据/信号,而程序属于软件范畴,是处理数据的逻辑,不是硬件输入设备。

───── ✨ 第2题 ✨ ─────

📖 题目

下面代码用来找出输入的N个正整数中最大的一个。如果将代码段用流程图来表示,则L1标记的代码行(if(val > max))应该使用的图形是( )。 

A. 圆形框    B. 椭圆形框    C. 平行四边形框    D. 菱形框

📌 大纲对应知识点:C++二级 流程图 - 流程图的概念与基本表示符号 🎯 考查目标:考查流程图不同图形符号的用途,能够识别判断逻辑对应的流程图符号。

📋 选项详解

选项
是否正确
详细解析
A. 圆形框
流程图中无圆形框作为标准符号,通常连接点用小圆,不是判断逻辑的符号。
B. 椭圆形框
椭圆形框是起止框,用于表示流程的开始和结束,不用于判断逻辑。
C. 平行四边形框
平行四边形框是输入输出框,用于表示数据的输入或输出操作。
D. 菱形框
✅ 正确选项
菱形框是判断框,用于表示条件判断逻辑,if(val > max)是典型的条件判断,符合要求。

⭐ 答案:D 📌 知识点:流程图基本符号

💡 解题小贴士:流程图符号记忆口诀:起止椭圆、处理矩形、输入输出平行四边形、判断菱形,遇到条件分支就选菱形准没错。

───── ✨ 第3题 ✨ ─────

📖 题目

下面C++代码可以执行,有关说法正确的是 ( )。

double PI = 3.1415926;cout << (PI);

A. 为了方便初学者,cout &lt;&lt; (PI)和cout &lt;&lt; (pi)效果相同,即变量的大小写不敏感 

B. cout &lt;&lt; (PI)修改为cout &lt;&lt; (Pi)能正常执行 

C. 不能用PI做变量名,因为要保存圆周率这个常量 

D. 将程序中全部PI都改写为Pai,将能正常执行,不会报错

📌 大纲对应知识点:C++一级 程序基本概念 - 标识符、变量的定义与使用 🎯 考查目标:考查C++标识符的大小写敏感规则,以及变量名的命名规范。

📋 选项详解

选项
是否正确
详细解析
A. 变量的大小写不敏感
C++是大小写敏感的语言,PI和pi是完全不同的两个标识符,未定义pi直接使用会报错。
B. 修改为cout &lt;&lt; (Pi)能正常执行
同理,Pi和PI是不同标识符,未定义Pi会报未声明标识符错误。
C. 不能用PI做变量名
虽然通常习惯用大写表示常量,但PI不是C++的关键字,用户可以合法使用PI作为变量名。
D. 将全部PI都改写为Pai能正常执行
✅ 正确选项
只要变量名是合法标识符,且所有引用处统一修改,程序就能正常运行,变量名的语义不影响编译。

⭐ 答案:D 📌 知识点:C++标识符命名规则

💡 解题小贴士:C++大小写敏感是基础语法规则,只要标识符由字母、数字、下划线组成,且不以数字开头、不是关键字,就可以合法使用,语义上的命名习惯不影响语法正确性。

───── ✨ 第4题 ✨ ─────

📖 题目

下面选择项中,与C++表达式!(x &gt; 5 &amp;&amp; y &lt;= 10)等价的是 ( )。 

A. x &lt;= 5 &amp;&amp; y &gt; 10 

B. x &gt; 5 || y &lt;= 10 

C. x &lt;= 5 || y &gt; 10 

D. ! x &gt; 5 &amp;&amp; ! y &lt;= 10

📌 大纲对应知识点:C++一级 基本运算 - 逻辑运算、关系运算 🎯 考查目标:考查逻辑运算的德摩根定律的应用,能够对复杂逻辑表达式进行等价转换。

📋 选项详解

选项
是否正确
详细解析
A. x &lt;= 5 &amp;&amp; y &gt; 10
根据德摩根定律,!(A &amp;&amp; B)等价于!A
B. x &gt; 5
y &lt;= 10
C. x &lt;= 5
y &gt; 10
D. ! x &gt; 5 &amp;&amp; ! y &lt;= 10
不仅逻辑运算符错误,!x &gt; 5的运算优先级也不符合要求,实际会先计算!x再和5比较,完全错误。

⭐ 答案:C 📌 知识点:逻辑运算 德摩根定律

💡 解题小贴士:德摩根定律记忆:非与等于或非,非或等于与非,即!(A&amp;&amp;B) = !A||!B,!(A||B) = !A&amp;&amp;!B,遇到逻辑取反的嵌套直接套用即可。

───── ✨ 第5题 ✨ ─────

📖 题目

某同学执行C++代码cout &lt;&lt; ((0.1 + 0.2) == 0.3)时输出0,下面最可能的原因是 ( )。 

A. C++的+运算符在处理小数时存在bug 

B. 0.1、0.2和0.3在计算机中无法用二进制浮点数精确表示,导致0.1 + 0.2的结果与0.3存在微小误差 

C. ==运算符不能用于比较浮点数,只能用于整数 

D. 因为0.1 + 0.2的数学结果不等于0.3

📌 大纲对应知识点:C++一级 基本数据类型 - 实数型(float、double) 🎯 考查目标:考查浮点数的二进制存储特性,理解浮点数精度误差的原因。

📋 选项详解

选项
是否正确
详细解析
A. +运算符处理小数存在bug
这是浮点数存储的固有特性,不是运算符的bug,是所有使用IEEE754浮点数标准的语言的共同特点。
B. 二进制浮点数无法精确表示部分小数,存在微小误差
✅ 正确选项
0.1、0.2的二进制表示是无限循环小数,存储时会截断,导致相加后的结果和0.3的存储值存在微小差异,所以==判断为假。
C. ==不能用于比较浮点数
==可以用于浮点数比较,只是由于精度问题,直接比较相等通常不符合业务需求,需要通过差值小于阈值的方式判断近似相等。
D. 数学上0.1+0.2不等于0.3
数学上0.1+0.2的结果确实是0.3,问题出在计算机的浮点数存储方式,不是数学定义的问题。

⭐ 答案:B 📌 知识点:浮点数精度特性

💡 解题小贴士:浮点数比较绝对不要直接用==,正确做法是判断fabs(a - b) &lt; 1e-6这样的近似相等,避免精度误差导致的逻辑错误。

───── ✨ 第6题 ✨ ─────

📖 题目

下面的C++代码段执行后其输出是 ( )。

int tnt = 0;for (int i = 0; i < 5; i++){    for (int j = 0; j < i; j++)        tnt += 1;    cout << tnt << "#";}cout << tnt;

A. 0#1#3#6#10#10 

B. 1#2#3#4#5#6#7#8#9#10#10 

C. 10#10 

D. 10

📌 大纲对应知识点:C++二级 多层循环结构 - for循环嵌套 🎯 考查目标:考查双重循环的执行流程,能够逐步跟踪变量的变化过程。

📋 选项详解

选项
是否正确
详细解析
A. 0#1#3#6#10#10
✅ 正确选项
逐轮执行分析:i=0:内层j&lt;0不执行,tnt=0 → 输出0#;i=1:j=0执行1次,tnt=1 → 输出1#;i=2:j=0、1执行2次,tnt=3 → 输出3#;i=3:j=0-2执行3次,tnt=6 → 输出6#;i=4:j=0-3执行4次,tnt=10 → 输出10#;最后输出tnt=10,整体结果符合。
B. 1#2#3#4#5#6#7#8#9#10#10
完全不符合循环累加的逻辑,第一轮i=0时tnt就是0,不可能从1开始输出。
C. 10#10
忽略了外层循环每次都会输出当前tnt的值,只考虑了最后两次输出。
D. 10
只考虑了最后一行的输出,遗漏了循环内的5次#结尾的输出

⭐ 答案:A 📌 知识点:双重循环执行流程

💡 解题小贴士:遇到循环嵌套的题目,第一轮循环一定要手动推演,确认初始值是否正确,再找规律,避免直接跳步导致错误。

───── ✨ 第7题 ✨ ─────

📖 题目

下面的C++代码执行之后的输出是 ( )。

for ( int i = -2; i < 2; i++)    if (not i % 3)        cout << i << "#";

A. 0# 

B. -2#-1#1

C. -1#0

D. -2#0#1#

📌 大纲对应知识点:C++一级 基本运算 - 算术运算、逻辑运算;循环结构 🎯 考查目标:考查取余运算的正负特性,以及not运算符的优先级规则。

📋 选项详解

选项
是否正确
详细解析
A. 0#
✅ 正确选项
运算符优先级中,%高于not,所以not i%3等价于!(i%3),即判断i%3是否为0;i=-2时-2%3=-2,i=-1时-1%3=-1,i=0时0%3=0,i=1时1%3=1,只有i=0满足条件,输出0#。
B. -2#-1#1#
这三个值的i%3都不为0,不满足条件。
C. -1#0#
-1%3的结果是-1,not -1的结果是0(假),不满足条件。
D. -2#0#1#
-2和1的取余结果都不为0,不满足条件。

⭐ 答案:A 📌 知识点:运算符优先级、取余运算

💡 解题小贴士:C++中逻辑非!(即not)的优先级高于算术运算符,取余%的优先级高于关系/逻辑运算符,不确定优先级的时候可以加括号明确,避免逻辑错误。

───── ✨ 第8题 ✨ ─────

📖 题目

下面的C++代码执行后其输出是 ( )。

int cnt = 0, i, j;for (i =1; i < 5; i++){    for (j =0; j < i; j++)       cout << j << "#";    break;}if(i >= 5)    cout << (i*j);

A. 0#0#1#0#1#2#0#1#2#3#12 

B. 0#0#1#0#1#2#0#1#2#3

C. 0# 

D. 1#

📌 大纲对应知识点:C++二级 多层循环结构 - break语句的使用 🎯 考查目标:考查break语句在循环中的作用,能够识别break对循环流程的影响。

📋 选项详解

选项
是否正确
详细解析
A. 0#0#1#0#1#2#0#1#2#3#12
外层循环第一次执行完内层循环后就遇到break,直接跳出外层循环,不会执行后续i=2、3、4的循环。
B. 0#0#1#0#1#2#0#1#2#3#
同样忽略了break的作用,外层循环只执行一次就终止。
C. 0#
✅ 正确选项
外层循环i=1时,内层循环j从0到0(j&lt;1),执行一次输出0#,然后遇到break直接跳出外层循环,后续if条件i&gt;=5不成立(i=1),所以最终输出只有0#。
D. 1#
内层循环j从0开始,第一次输出的是j=0,不是1。

⭐ 答案:C 📌 知识点:break语句的作用

💡 解题小贴士:break语句只会跳出当前所在的那一层循环,如果外层循环中直接写break,会直接终止整个外层循环,注意和continue的区别。

───── ✨ 第9题 ✨ ─────

📖 题目

下面C++代码执行后其输出是 ( )。

int count = 0;for (int i = 1; i < 4; i++)    for (int j = 1; j < 5; j++){        if (j == 3)            continue;        if (i == 2)            break;        count += 1;    }cout << (count);

A. 2        B. 4       C. 6       D. 8

📌 大纲对应知识点:C++二级 多层循环结构 - break与continue的区别 🎯 考查目标:考查break和continue在嵌套循环中的不同作用,能够准确跟踪计数变量的变化。

📋 选项详解

选项
是否正确
详细解析
A. 2
低估了符合条件的循环次数。
B. 4
计算错误。
C. 6
✅ 正确选项
逐轮执行:i=1(外层第一轮):j=1:不触发continue/break → count=1;j=2:不触发 → count=2;j=3:触发continue,跳过本次循环,count不变;j=4:不触发 → count=3;i=2(外层第二轮):j=1:j≠3,但i==2,触发break,直接跳出内层循环,本轮count无增加;i=3(外层第三轮):j=1:不触发 → count=4;j=2:不触发 → count=5;j=3:触发continue,跳过;j=4:不触发 → count=6;最终count=6。
D. 8
没有考虑continue跳过j=3的情况,以及i=2时break跳出内层循环的情况。

⭐ 答案:C 📌 知识点:break与continue的区别

💡 解题小贴士:continue是跳过本次循环剩余语句,直接进入下一次循环,而break是直接终止当前整个循环,两者作用完全不同,遇到嵌套循环时一定要分清楚作用的层级。

───── ✨ 第10题 ✨ ─────

📖 题目

下面4个选项中,与下面C++代码段具有相同效果的是 ( )。

i = 0;while (i < 5){    cout << i;    i += 1;}

A.

for (i = 0; i < 5; i++)    cout << i;

B.

for (i = 1; i < 5; i++)    cout << i;

C.

for (i = 0; i < 6; i++)    cout << i;

D.

for (i = 1; I < 6; i++)    cout << i;

📌 大纲对应知识点:C++一级 循环结构 - while循环与for循环的转换 🎯 考查目标:考查while循环和for循环的等价转换,理解两种循环的执行逻辑。

📋 选项详解

选项
是否正确
详细解析
A. for(i=0;i&lt;5;i++) cout&lt;&lt;i;
✅ 正确选项
原while循环的逻辑是:i初始为0,当i&lt;5时输出i,然后i自增,执行过程是输出0、1、2、3、4。该for循环的初始化、条件判断、增量完全和while一致,输出结果相同。
B. for(i=1;i&lt;5;i++) cout&lt;&lt;i;
初始值为1,输出1、2、3、4,和原代码输出0开头不一致。
C. for(i=0;i&lt;6;i++) cout&lt;&lt;i;
循环条件为i&lt;6,会输出0到5,比原代码多输出一个5。
D. for(i=1;i&lt;6;i++) cout&lt;&lt;i;
初始值1,条件i&lt;6,输出1到5,完全和原代码不同。

⭐ 答案:A 📌 知识点:while与for循环的等价转换

💡 解题小贴士:for循环的三部分for(初始化;条件;增量)完全等价于while循环的初始化;while(条件){ 代码; 增量; },转换时只要对应三部分一致,执行效果就完全相同。

───── ✨ 第11题 ✨ ─────

📖 题目

下面C++代码执行后输出是( )。

int n = 10;while (n > 0){    n -= 1;    if (n % 3 == 0)        continue;    if (n == 5)        break;}cout << n;

A. 0        B. 5        C. 6        D. 7

📌 大纲对应知识点:C++一级 循环结构 - break与continue的使用 🎯 考查目标:考查while循环中break和continue的执行流程,能够跟踪变量的变化直到循环终止。

📋 选项详解

选项
是否正确
详细解析
A. 0
循环在n=5时就触发break终止,不会运行到n=0。
B. 5
✅ 正确选项
逐轮执行:初始n=10;n=10→减1为9,9%3==0→continue,跳过后续代码;n=9→减1为8,8%3≠0,不等于5→继续;n=8→减1为7,7%3≠0,不等于5→继续;n=7→减1为6,6%3==0→continue;n=6→减1为5,5%3≠0,但n==5→触发break,循环终止;最终输出n=5。
C. 6
n=6时先减1才会进行判断,所以不会停在6。
D. 7
循环会继续执行到n=5才终止。

⭐ 答案:B 📌 知识点:循环中break与continue的流程

💡 解题小贴士:遇到这种循环里有多个跳转语句的题目,一定要逐轮写变量值,不要凭感觉跳步,很容易出错。

───── ✨ 第12题 ✨ ─────

📖 题目

下面C++代码段执行后,其输出是( )。

int i, j, cnt;cnt = 0;for (i = 0; i < 5; i++){    i = -i;    for (j = i; j < -i; j++)        cnt += 1;    i = -i;}cout << cnt;

A. 5        B. 15        C. 20        D. 30

📌 大纲对应知识点:C++二级 多层循环结构 - 复杂嵌套循环的执行 🎯 考查目标:考查循环变量的动态修改对循环流程的影响,能够准确计算内层循环的执行次数。

📋 选项详解

选项
是否正确
详细解析
A. 5
低估了内层循环的执行次数。
B. 15
计算错误。
C. 20
✅ 正确选项
逐轮分析外层循环:i=0:i=-0=0 → 内层j从0到0(j&lt;0不成立)→ 执行0次,cnt不变;i恢复为0;i=1:i=-1 → 内层j从-1到1(j&lt;1)→ j=-1,0 → 2次,cnt=2;i恢复为1;i=2:i=-2 → 内层j从-2到2(j&lt;2)→ j=-2,-1,0,1 →4次,cnt=6;i恢复为2;i=3:i=-3 → 内层j从-3到3(j&lt;3)→6次,cnt=12;i恢复为3;i=4:i=-4 → 内层j从-4到4(j&lt;4)→8次,cnt=20;i恢复为4;外层循环结束,最终cnt=20。
D. 30
多计算了i=5的情况,外层循环i&lt;5,只到i=4。

⭐ 答案:C 📌 知识点:嵌套循环执行次数计算

💡 解题小贴士:循环中如果修改了循环变量,一定要注意修改是临时的还是会影响外层循环的迭代,本题中i在循环内被修改后最后又恢复,所以不影响外层循环的i递增。

───── ✨ 第13题 ✨ ─────

📖 题目

某学校图书馆的借阅卡号由6位整数组成。前5位是顺序编号,第6位是校验码,用于防止输错。校验码规则如下:将前5位数字相加,然后除以10的余数,就是第6位数字。如卡号123455的前5位之和为15,除以10的余数是5,故第6位为5。下面的C++代码段用于判断卡号是否正确,横线处应填入的代码是 ( )。

cout << " 请输入卡号: ";cin >> N;order_num = N / 10; // 获得前5位顺序号,假设录入一定为6位正整数check_num = N % 10; // 获得最后一位tnt = 0; // 保存前5位之和for (i = 0; i < 5; i++){    ;    order_num /= 10;}if ()    cout << " 符合校验规则 ";else    cout << " 不符合校验规则 ";

A.

tnt += order_num / 10tnt / 10 == check_num

B.

tnt += order_num % 10tnt % 10 == check_num

C.

tnt = order_num / 10 + tnttnt % 10 == check_num

D.

tnt = order_num % 10tnt / 10 == check_num

📌 大纲对应知识点:C++二级 循环结构 - 数位提取算法 🎯 考查目标:考查通过取余和整除提取整数数位的方法,以及校验逻辑的实现。

📋 选项详解

选项
是否正确
详细解析
A
order_num /10是去掉最后一位的数,不是当前的个位数字,求和逻辑错误;校验应该用和对10取余,不是除以10。
B
✅ 正确选项
每次通过order_num %10提取当前order_num的个位数字加到tnt中,然后order_num /=10去掉个位,循环5次就能得到前5位的和;校验时判断tnt%10(和除以10的余数)是否等于校验码check_num,完全符合规则。
C
order_num /10 + tnt是把去掉个位的数加到tnt中,不是加个位数字,求和逻辑错误。
D
每次直接把当前个位赋值给tnt而不是累加,会覆盖之前的和,求和错误;校验用除以10也不符合规则。

⭐ 答案:B 📌 知识点:数位提取、校验算法

💡 解题小贴士:提取整数的各位数字固定套路是:循环中x%10取个位,然后x /=10去掉个位,直到x为0,这个是二级考试的高频考点。

───── ✨ 第14题 ✨ ─────

📖 题目

下面的C++代码段正常执行后其输出的数字图形是( )。

for (i = 1; I < 5; i++){    for (j = 1; j < i+1; j++)        cout << j;    cout << endl;}

A.

1121231234

B.

1223334444

C.

1213214321

D.

4342341234

📌 大纲对应知识点:C++二级 多层循环结构 - 图形打印 🎯 考查目标:考查双重循环打印图形的逻辑,能够根据循环变量判断输出内容。

📋 选项详解

选项
是否正确
详细解析
A
✅ 正确选项
逐行分析:i=1:j从1到1 → 输出1,换行;i=2:j从1到2 → 输出12,换行;i=3:j从1到3 → 输出123,换行;i=4:j从1到4 → 输出1234,换行;和选项A完全一致。
B
每行输出的是相同的数字,而代码中j是递增的,输出的是1,2,3...的序列。
C
数字是倒序的,不符合j从1到i的递增输出逻辑。
D
数字从高位开始,和代码逻辑完全相反。

⭐ 答案:A 📌 知识点:双重循环打印图形

💡 解题小贴士:图形打印题的核心是看外层循环控制行数,内层循环控制每行的输出内容,先看每行输出多少个字符,再看每个位置的字符和行号、列号的关系。

───── ✨ 第15题 ✨ ─────

📖 题目

某学校举办 “校园演讲比赛”,每位选手由8位评委打分(分数为0~10的整数),且每位评委必须打分。计分规则:若至少有5位评委给出大于等于6分,则成绩有效,最终得分为所有8位评委的总分;如给出低于6分的评委数量超过5位,则记为0分。以下核心程序段依次输入8个分数,并计算最终得分。横线处应填入( )。

total_score = 0; // 所有分数之和high_count = 0;  // ≥6 分的评委数量for (i = 0; i < 8; i++){    cout << " 请输入评委分数 : ";    cin >> score;    ;    if (score >= 6)        ;}if (high_count >= 5)    cout << total_score;else    cout << 0;

A.

total_score += scorehigh_count += 1

B.

total_score += scorehigh_count += score

C.

high_count += 1total_score += score

D.

total_score *= scorehigh_count *= 1

📌 大纲对应知识点:C++二级 分支与循环结构的综合应用 🎯 考查目标:考查根据业务逻辑补全代码的能力,理解累加计数的实现方式。

📋 选项详解

选项
是否正确
详细解析
A
✅ 正确选项
第一个空需要把当前评委的分数加到总分中,所以是total_score += score;第二个空是当分数≥6时,高分评委数加1,所以是high_count +=1,完全符合逻辑。
B
high_count += score是把分数加到计数里,不是计数加1,逻辑错误。
C
顺序错误,不管分数是否≥6都应该先累加到总分,而且高分计数应该在条件判断内加1,不是无条件加1。
D
总分用乘法完全不符合求和逻辑,计数用乘1也没有意义。

⭐ 答案:A 📌 知识点:循环累加、条件计数

💡 解题小贴士:补全代码题首先要理解每个变量的含义,total_score是总和,肯定用+=累加;high_count是计数器,符合条件时用+=1计数,这是最基础的编程模式。

📝 学习建议

本次二级考试的单选题核心考点集中在多层循环的执行流程、break/continue的区别、逻辑运算规则、数位提取、基础算法逻辑,这几个部分是二级考试的高频考点,大家复习时要多做循环嵌套的练习题,手动推演循环执行过程,避免逻辑错误。

抱歉,评论功能暂时关闭!