CCF-GESP 2025 年 9 月 C++ 二级真题解析
本文解析了 CCF-GESP 2025 年 9 月 C++ 二级考试真题,涵盖单选题、判断题和编程题。主要考点包括人工智能基础概念、TCP 协议握手、标识符命名规则、运算符优先级、循环控制语句(break/continue)、ASCII 码运算及基本数据类型转换。编程题涉及统计“优美数”与输出空心菱形图案,重点考察循环嵌套与数位分离逻辑。文章提供了详细的答案解析与参考代码实现。

本文解析了 CCF-GESP 2025 年 9 月 C++ 二级考试真题,涵盖单选题、判断题和编程题。主要考点包括人工智能基础概念、TCP 协议握手、标识符命名规则、运算符优先级、循环控制语句(break/continue)、ASCII 码运算及基本数据类型转换。编程题涉及统计“优美数”与输出空心菱形图案,重点考察循环嵌套与数位分离逻辑。文章提供了详细的答案解析与参考代码实现。


正确答案:D
考察知识点:计算机相关知识
解析:在人工智能领域,'大模型'最贴切的通常是指大语言模型。大语言模型是基于大规模文本数据训练的,能够理解和生成自然语言等内容,像常见的 ChatGPT 等就属于大语言模型范畴。而选项 A'大电脑模型'表述不准确;选项 B'大规模智能'不是对'大模型'的准确指代;选项 C'智能的单位'也不符合'大模型'的定义。答案为 D。

正确答案:C
考察知识点:计算机的存储与网络
解析:在 TCP 协议中,建立连接需要通过三次握手。第一次握手是客户端向服务器发送连接请求;第二次握手是服务器收到请求后,向客户端发送确认和自己的连接请求;第三次握手是客户端收到服务器的回复后,再向服务器发送确认,这样双方就建立起可靠的连接了。答案为 C。

正确答案:C
考察知识点:标识符的命名规则
解析:根据变量的命名规则:只能包含字母、数字和下划线;不能以数字开头;不能和关键字重名。B、D 选项包含了其他字符' ','-',不能作为变量名。A 选项,汉语拼音只要符合变量的命名规则,也可以作为变量名。答案为 C。


正确答案:D
考察知识点:基本运算符、流程控制语句 - 循环
解析:首先,div 的作用是通过循环乘以 10,得到一个数,使得 N / div 可以把第 M 位及更高位的数保留,去掉低位。比如 N = 1234,M = 2 时,循环后 div = 10。然后 N / div 得到 123(整数除法),再对 10 取余,就得到第 2 位的数字 3。所以横线处应填 N / div % 10。答案为 D。

正确答案:D
考察知识点:基本运算符
解析:首先这里变量 a,b,c 没有定义,写法是不合法的。
假定第一行代码之前定义了整形变量 a,b,c,则第一行执行结束,a 没有赋值,b 赋值为 3;第二行代码先执行比较运算符==,再执行赋值运算符=,因 a 没有赋值,其值未知,因此 a==b 的结果未知,则 c 的值未知,输出结果当然未知。答案为 D。

正确答案:A
考察知识点:基本运算、流程控制语句 - 选择
解析:第 7-10,根据 part1 的值选择不同的输出格式,XX 从 00 变化到 11,即 part1,对 12 取余结果为 011;Y 从 0 变化到 9,即 part2,对 10 取余结果为 09;答案为 A。


正确答案:D
考察知识点:控制语句结构 - 循环
解析:i 的值为 -100,内层循环的循环条件不成立,cnt+=1 未被执行;i 的值为 19,根据内层循环的循环条件,cnt+=1 被执行次数为 i 次,则 cnt+=1 一个执行了:1+2+…+9=45 次,答案为 D。

正确答案:B
考察知识点:循环嵌套、流程控制语句、break、continue
解析:外层循环 i 从 1 到 11(因为 i < 12)。当 i 为偶数时,执行 continue,跳过本次循环剩余部分,所以只看 i 为奇数的情况(i = 1,3,5,7,9,11)。内层循环 j 从 0 到 i,当 i*j 为奇数时,执行 break,终止内层循环。当 i 等于 11,j 等于 1 时,第 6 行条件成立,终止内层循环,此时 i 再增大为 12,外层循环条件不成立,循环结束。此时 i 的值为 12,j 的值为 1。答案为 B。

正确答案:D
考察知识点:控制语句结构 - 循环、基本运算符
解析:在 C++ 中,取余运算 a % b 里,b 不能为 0,否则会导致运行时错误(除以零错误),但本题中 b 等于 0 不会进入循环,也即不会执行到 a%b,选项 A 错误;
a 和 b 的大小关系不影响取余运算的合法性,只是结果不同,选项 B 错误;
a 和 b 可以是负整数,取余运算在 C++ 中有相应规则,并非必须为正整数才合法,选项 C 错误;
选项 D:如果 a 输入为 0,当 b 为非零值时,第一次循环 remainder = 0 % b = 0,然后 a = b,b = 0,循环结束,输出 a(即 b 的原始值),
如果 b 为 0,不进入循环,直接输出 a(和 b 的值相等)。答案为 D。

正确答案:A
考察知识点:控制语句结构 - 循环、continue 关键字
解析:初始 num = 0,进入 while 循环(num <= 5)。
第一次循环:num += 1 后 num = 1,num != 3,执行 printf,输出 1#。
第二次循环:num += 1 后 num = 2,num != 3,执行 printf,输出 2#。
第三次循环:num += 1 后 num = 3,num == 3,执行 continue,跳过 printf。
第四次循环:num += 1 后 num = 4,num != 3,执行 printf,输出 4#。
第五次循环:num += 1 后 num = 5,num != 3,执行 printf,输出 5#。
第六次循环:num += 1 后 num = 6,num != 3,执行 printf,输出 6#。
最终输出为 1#2#4#5#6#。答案为 A。


正确答案:D
考察知识点:流程控制语句 - 循环
解析:选项 A:若第一个数输入 -999,min_num 和 max_num 会被赋值为 -999,且循环不执行,输出 -999 -999,该选项正确。
选项 B:若第一个数不是 -999,且后续没有 -999,程序会正常比较每个输入数,求出最大和最小数,该选项正确。
选项 C:考试成绩中无 -999,程序能正常运行求出最高和最低成绩,该选项正确。
选项 D:D 循环有点描述不清,但无论是移动第 1 行还是第 11 行,都会出现问题。
移动第一行,则 min_num 和 max_num 的初值变为未知值,后续无法比较。
移动第 11 行,输入的第一个数作为最大、最小值没问题,进入循环即输入下一个数,这个数参与比较,如果这个是 -999,会产生错误。
答案为 D。

正确答案:C
考察知识点:控制语句结构 - 循环、循环嵌套、数位分离、break、continue
解析:第 3 行 if 语句判断是否是 5 的倍数,如果是则 cnt++,执行 continue 进入下一次循环;否则数位分离判断是否含有 5;
A 选项,删除 continue,对于 5 这样既是 5 的倍数,也含有 5 的数,cnt+=1 会被执行 2 次,不符合要求,A 错误。
选项 B:j = i 是为了在不改变 i 的情况下,对 i 的每一位进行判断。若删除 j = i 并将 while 循环内的 j 改为 i,会改变 i 的值,影响外层循环的次数和逻辑,影响结果,B 错误。
选项 D:原 while (j > 0) 是判断 j 为正整数时进行位判断。若改为 while (j >= 0),当 j = 0 时还会进入循环,j % 10 == 0,会执行 else 里的 j /= 10(j 还是 0),进入死循环,影响结果,D 错误。
选项 C:break 的作用是当发现数字含 5 时,跳出 while 循环。将 break 改为 j = 0,也能跳出 while 循环(因为 j > 0 不成立了),效果相同,不影响程序执行结果,C 正确。答案为 C。


正确答案:A
考察知识点:循环嵌套
解析:当 N 为 10 时,第 1 行输出 9 个空格,第 2 行输出 8 个空格,以此类推,第 i 行输出 N-i 个空格。
当 N 为 10 时,第 1 行输出 1 个数字,第 2 行输出 2 个数字,以此类推,第 i 行输出 i 个数字。
循环条件用的小于号,循环变量从 1 开始,横线处应该填写:N-i+1,i+1。答案为 A。

正确答案:A
考察知识点:基本数据类型、基本运算、ASCII 码
解析:a='a'+'b',字符类型参与运算,实际上是其对应的 ASCII 参与运算,且 a 是整数类型,因此 a 的值为 97+98=195。
同,b 的值为 97-98=-1。此时 a=a-b=196。答案为 A。


正确答案:D
考察知识点:基本运算
解析:代码中 G = (N - 1) / 9 和 R = (N - 1) % 9 是对 N-1 进行九进制相关的分解,后续根据余数 R 的不同范围计算对应重量。选项 A 中说必须同时修改 L1 和 L2 才能实现功能,没有依据;选项 B 说必须同时修改 L3 和 L4,也无依据;选项 C 说必须同时修改 L3 和 L5,同样无依据。所以其他说法都不对。答案为 D。

正确答案:错误
考察知识点:集成开发环境
解析:在现代集成开发环境(如 Visual Studio、Eclipse 等)中,调试过程中是可以修改源程序的,很多集成开发环境支持'编辑并继续'功能,修改后不需要终止调试、关闭文件再重新打开,能在调试过程中直接应用修改并继续调试。表述错误。

正确答案:正确
考察知识点:基本运算
解析:在 C++ 中,整数除法是取整运算(舍去小数部分)。当 N 是正整数且大于 100 时,比如 N = 1234,1234 / 100 = 12.34,整数除法会舍去小数部分,得到 12,也就是舍弃了个位(4)和十位(3);当 N 小于 100 时,比如 N = 50,50 / 100 = 0.5,整数除法后结果为 0。表述正确。

正确答案:错误
考察知识点:基本运算
解析:上述 C++ 代码执行后输出确实为 1,但不是题目描述中的原因。
原因是:a<10 and 20 出现了比较运算符和逻辑运算符,比较运算符的优先级更高,a 的值为 5,a<10 的结果为真,true and 20 结果为真。实际上,只要 a<10 成立,输出即为 1。表述错误。

正确答案:正确
考察知识点:基本运算
解析:第 1 行代码执行完毕,x,y 值未知,z 赋值为 5,x<y<z,先执行 x<y,因为 x,y 值未知,因此 x<y 结果未知,但不是 true 就是 false,用此结果和 z 比较,z 的值为 5,比较结果 result 是 true,输出为 1。表述正确。

正确答案:正确
考察知识点:基本数据类型
解析:输入 99.99,存入 int 类型变量 score 中,score 只存储整数部分 99,99>=60 成立,执行第 5 行代码,输出 及格,表述正确。

正确答案:错误
考察知识点:基本运算、数据类型转换
解析:当输入 123 时,进入 while 循环:
第一次循环:a%10 = 123%10 = 3,'A' + 3 = 'D',输出 D;然后 a = 123 / 10 = 12。
第二次循环:a%10 = 12%10 = 2,'A' + 2 = 'C',输出 C;然后 a = 12 / 10 = 1。
第三次循环:a%10 = 1%10 = 1,'A' + 1 = 'B',输出 B;然后 a = 1 / 10 = 0,循环结束。
最终输出为 DCB,所以该判断题答案为正确。表述错误。

正确答案:正确
考察知识点:控制语句结构 - 循环、continue 关键字
解析:执行 for 循环:
当 i = 0 时,不满足 if 条件,执行 printf('+#'),输出+#;
当 i = 1 时,不满足 if 条件,执行 printf('+#'),输出+#;
当 i = 2 时,满足 if 条件,执行 continue,跳过本次循环剩余语句;
循环结束后,i 的值为 3,执行 cout << i << '#',输出 3#。
最终输出为 +#+#3#,所以该判断题答案为正确。表述正确。

正确答案:正确
考察知识点:控制语句结构 - 循环
解析:初始化 a = 0(对应斐波那契数列第 1 个数),b = 1(对应第 2 个数)。
循环执行 n 次:
每次先输出 a;
然后通过 b = b + a 计算下一个数的和,再通过 a = b - a 更新 a 为原来的 b(即下一个斐波那契数)。
例如,若 n = 5,输出为 0 1 1 2 3,符合斐波那契数列规律,因此该代码能实现功能,判断题答案为正确。表述正确。

正确答案:正确
考察知识点:控制语句结构 - 循环
解析:原代码中,当 i == j 时执行 continue,会跳过 cout << 0;(L1),导致对角线外的位置无法输出 0。
若将 cout << 0;移到 if 块外面(或 L2 位置),则无论 i 和 j 是否相等,都会执行输出 0 的操作,只是当 i == j 时先输出 i+1,再输出 0(或在循环结构中合理输出),从而实现题目中的矩阵输出格式。因此该判断题答案为正确。表述正确。

正确答案:错误
考察知识点:基本运算、基本数据类型、数据类型转换
解析:字符类型参与运算,实际上是其对应的 ASCII 码参与运算,运算结果为整数。'5'+4=53+4=58。表述错误。


#include <bits/stdc++.h>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
// 不超过 n 的优美正整数,遍历 1~n
// 判断 i 是否是优美数:十进制下的所有数位都相同,用 flag 标记是否是优美数
bool flag = true;
int t = i % 10; // t 存储 i 的个位数
// 数位分离判断 i 的所有数位是否都等于 t
int tmp = i; // 不能直接对循环变量 i 操作,使用 tmp 存储 i,操作 tmp
while (tmp != 0) {
if (tmp % 10 != t) { // 当前数位不等于 t,不是优美数,终止循环
flag = false;
break;
}
tmp /= 10;
}
if (flag) cnt++; // flag 为 true 意味着 i 是优美数
}
cout << cnt;
return 0;
}



#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
// 上部分
for (int i = 0; i <= n / 2; i++) {
for (int j = 0; j < n; j++) {
if (j == n / 2 - i || j == n / 2 + i) cout << "#";
else cout << ".";
}
cout << endl;
}
// 下部分
for (int i = n / 2 - 1; i >= 0; i--) {
for (int j = 0; j < n; j++) {
if (j == n / 2 - i || j == n / 2 + i) cout << "#";
else cout << ".";
}
cout << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i <= n / 2 && (j == n / 2 - i || j == n / 2 + i)) cout << "#";
else if (i >= n / 2 && (j == n / 2 - (n - 1 - i) || j == n / 2 + (n - 1 - i))) cout << "#";
else cout << ".";
}
cout << endl;
}
return 0;
}

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online