跳到主要内容
CCF-GESP 2025 年 9 月 C++ 三级真题解析 | 极客日志
C++ 算法
CCF-GESP 2025 年 9 月 C++ 三级真题解析 综述由AI生成 解析了 CCF-GESP 2025 年 9 月 C++ 三级认证考试的真题,涵盖单选题、判断题及编程题。内容涉及基本数据类型、运算符、数组、函数、循环控制、变量作用域及模拟算法等知识点。提供了每道题的正确答案、详细解析及参考代码,帮助考生理解考点与解题思路。
GitMaster 发布于 2026/3/23 更新于 2026/5/28 4.7K 浏览2025 年 9 月真题
一、单选题(每题 2 分,共 30 分)
正确答案:C
考察知识点:基本数据类型、基本运算符
解析:在 C++ 中,a 和 b 都是 int 类型,a / b 会进行整数除法,结果为 3(因为 10÷3 整数部分是 3)。然后将 3 赋值给 double 类型的 c,c 的值为 3.0。答案为 C。
正确答案:C
考察知识点:基本运算符
解析:选项 A:(5 <= 5) 为 true,(7 < 5) 为 false,&& 要求全为 true,结果 false。
选项 B:(10 > 5) 为 true,!取反后 false。
选项 C:(10 != 10) 为 false,(5 >= 3) 为 true,||只要有一个 true 就为 true,结果 true。
选项 D:(5 == 3) 为 false,&&要求全为 true,结果 false。答案为 C。
正确答案:D
考察知识点:一维数组
解析:数组下标从 0 开始,int arr[5]; 下标范围为 0~4。访问数据元素:数组名 [下标],arr[5] 超出了数组的合法访问范围,属于越界访问,会导致未定义行为。答案为 D。
正确答案:B
考察知识点:流程控制结构 - 循环、变量的作用域
解析:外层 sum 初始为 0。
循环过程:
i = 1:sum += 1 → sum = 1;此 sum 为外层 sum;然后在循环内部定义了一个新的局部变量 int sum = 0;,在循环内定义的变量,其作用范围:从创建位置开始到循环的右大括号为止,不影响外层的 sum。
循环体结束,内部 sum 被销毁。
i = 3:sum += 3 → sum = 4;此 sum 为外层 sum;然后再次定义内部 sum = 0,不影响外层。循环体结束,内部 sum 被销毁
i = 5:sum += 5 → sum = 9;此 sum 为外层 sum;内部 sum = 0 再次被定义,循环体结束被销毁。
i = 7:不满足 i <= 5,循环结束。
循环结束,外层 sum 的值为 9。答案为 B。
正确答案:B
考察知识点:函数(超纲)
解析:要定义返回两个整数较大值的函数 max,需注意返回值类型为 int,且参数需明确类型。
选项 A:返回值类型 void,错误。
选项 C:参数未指定类型,错误。
选项 D:返回值类型 void,且参数未指定类型,错误。
选项 B:返回值类型 int,参数类型明确,逻辑正确。答案为 B。
正确答案:B
考察知识点:一维数组
解析:首先,数组 arr[4] 初始化时,未显式初始化的元素默认为 0,即初始为{1, 2, 3, 0}。然后,arr[3] = arr[0] + arr[2] = 1 + 3 = 4,所以数组变为{1, 2, 3, 4}。答案为 B。
正确答案:B
考察知识点:函数(超纲)
解析:选项 A:函数可以无参数,错误。
选项 C:main 函数是程序入口,不能被其他函数调用,错误。
选项 D:C++ 函数不能嵌套定义,错误。
选项 B:函数 return 只能返回一个值,但可通过指针、引用等间接返回多个值,正确。答案为 B。
正确答案:D
考察知识点:流程控制语句 - 循环、continue
解析:循环条件为 i > 0。每次循环中,先执行 i -= 3,然后执行 continue(直接跳过后续代码,回到循环条件判断)。因此,count++ 从未被执行,其值未发生改变,循环结束仍然是 0。答案选 D。
正确答案:A
考察知识点:循环嵌套
解析:当 i=0 时,j 从 0 到 0,输出 0,然后输出#,即 0#。
当 i=1 时,j 从 0 到 1,输出 01,然后输出#,即 01#。
当 i=2 时,j 从 0 到 2,输出 012,然后输出#,即 012#。
当 i=3 时,j 从 0 到 3,输出 0123,然后输出#,即 0123#。
综上,输出为 0#01#012#0123#。答案为 A。
正确答案:C
考察知识点:函数、变量作用域(超纲)
解析:C 选项:在所有函数外部声明的变量是全局变量,其作用域是从声明处到整个程序结束。但如果程序是多文件结构,且全局变量未用 extern 声明跨文件使用,仅在声明的文件内有效,并非在整个程序中都有效。答案为 C。
正确答案:D
考察知识点:流程控制语句 - 循环、数位分离应用 - 翻转数字
解析:该代码用于整数反转,但要受 int 类型范围限制(-2147483648~2147483647),反转后也不能超出 int 范围。
A 选项:错误,显然不能完成任何位数整数的反转。
B 选择:错误,2147483647 反转后是 7463847412,显然超出 int 范围,所以这个数反转时会溢出,因此不能正确反转。
C 选项:错误,2147483648 对于 32 位有符号 int 来说已经超出正数最大值,输入时就不行,而且它反转是 8463847412,更大,肯定溢出。
D 选项:反转 1463847412 → 2147483641,2147483641 ≤ 2147483647,没有溢出。如果反转大一点的数:1463847413,反转是 3147483641,这个显然大于 int 可以存在的最大整数,会溢出。所以 1463847412 是能反转且不溢出的最大正整数。答案为 D。
正确答案:C
考察知识点:一维数组
解析:第 4 行:假定数组的第一个元素(下标 0)为最大值,之后将从第二个元素(下标 1)开始的每一个元素和最大值进行比较,如果比最大值更大,更新最大值。也称打擂台法。答案为 C。
正确答案:D
考察知识点:函数(超纲)
解析:选项 A:C++ 函数参数传递有三种方式:值传递 :传递参数副本,函数内修改不影响原变量;引用传递 :传递变量引用(别名),函数内修改直接作用于原变量;指针传递 :传递变量地址,通过指针间接修改原变量。A 错误。
选项 B:形参是函数调用时创建的局部变量,存储在栈内存中。函数调用结束后,栈帧销毁,形参占用的内存空间会被系统释放,不再占用内存。B 错误。
选项 C:无返回值函数必须声明为 void 类型,这是 C++ 语法要求;此类函数可包含 return 语句(不带返回值),用于提前退出函数,语法合法。C 错误。
选项 D:C++11 及后续标准要求所有函数必须显式声明返回类型,废除了 C 语言中默认返回 int 的规则,增强了类型安全性。D 正确。答案为 D。
正确答案:C
考察知识点:一维数组
解析:错误 1:for 循环条件 i <= SIZE,数组 arr 大小为 5,下标范围是 0-4,此处会越界访问。
错误 2:cout << arr[SIZE],arr[SIZE](即 arr[5])超出数组下标范围,越界访问。一共 2 处错误,答案为 C。
正确答案:D
考察知识点:字符数组、字符串及其函数
解析:string 对象可以使用 == 运算符来直接比较两个字符串的内容是否相同。而字符数组要比较两个字符串的内容是否相同需要使用 strcmp() 函数。答案为 D。
二、判断题(每题 2 分,共 20 分) 正确答案:错误
考察知识点:字符类型、sizeof 函数
解析:sizeof('a') 的行为
在 C 语言中:'a' 的类型是 int,sizeof('a') 通常等于 sizeof(int)(结果是 4)。
在 C++ 中:'a' 的类型是 char,sizeof('a') 等于 sizeof(char)(结果是 1)。
因此结果总是 1,表述错误。
正确答案:正确
考察知识点:变量的作用域、全局变量和局部变量
解析:在 C++ 中,全局变量(包括全局作用域的变量和静态变量)如果没有显式初始化,编译器会将其自动初始化为 0(对于基本数据类型,如 int、float 等;对于复合类型,如数组、结构体等,其每个元素或成员也会被相应地初始化为 0 或空值)。这是 C++ 的语言特性,用于保证全局变量在未显式初始化时具有确定的初始值,避免出现未定义行为。表述正确。
正确答案:正确
考察知识点:流程控制语句 - 循环
解析:do-while 循环的执行机制是先执行循环体,再判断条件。所以不管条件是否为真,循环体内的语句至少会执行一次。此处条件是 false,循环体执行一次后判断条件不满足,循环结束。表述正确。
正确答案:正确
考察知识点:自增运算符、左值、右值的概念
解析:在 C++ 中:左值 (lvalue)指的是可以取地址、有持久状态的表达式,通常可以出现在赋值语句的左边。
右值 (rvalue)通常是临时对象或字面量,不能取地址,不能放在赋值左边。
++i 是前置递增,它返回的是 i 的引用(即变量 i 本身),因此是左值。
i++ 是后置递增,它返回的是 i 在递增之前的值的临时副本,因此是右值。
因此题目中,++i 是一个左值表达式,而 i++ 是一个右值表达式。表述正确。
正确答案:错误
考察知识点:枚举(超纲)
解析:枚举值(如 RED)的类型就是其枚举类型本身(这里是 Color),不是 int。
枚举类型是一种独立的类型,与 int 不同,枚举值可以隐式转换为整数类型,但这是类型转换,不是类型本身。表述错误。
正确答案:错误
考察知识点:宏定义
解析:宏定义是 C/C++ 中的预处理指令,用于在编译前进行文本替换。基本语法是:#define 宏名 替换文本。
宏定义的类型
简单宏:
#define PI 3.14159 //用 3.14159 替换代码中所有的 PI
#define MAX_SIZE 100 //用 100 替换代码中所有的 MAX_SIZE
带参数宏
#define SQUARE(x) ((x) * (x)) // 用 (x) * (x) 替换代码中所有的 SQUARE(x)
#define MAX(a, b) ((a) > (b) ? (a) : (b)) //用 (a) > (b) ? (a) : (b) 替换代码中所有的 MAX(a, b)
按以上,SQUARE(2+3) 展开为 2+3 * 2+3 = 2 + 6 + 3 = 11。表述错误。
如果想要计算出 25,应该写成 #define SQUARE(x) ((x) * (x))。
正确答案:错误
考察知识点:字符类型
解析:在 C++ 中,char 类型有三种可能性:
signed char:范围通常是 -128 到 127(在大多数平台上,采用补码表示,8 位)。
unsigned char:范围是 0 到 255。
普通 char:它可能是 signed char 也可能是 unsigned char,由编译器的实现决定。
因此,char 类型的取值范围并不总是 -128 到 127,它可能是 0 到 255,也可能是 -128 到 127,取决于编译器和平台。表述错误。
正确答案:错误
考察知识点:条件运算符,运算符的优先级
解析:本题表达式中出现了两种运算符:条件运算符和赋值运算符,条件运算符 ? : 的优先级高于赋值运算符 =,因此本题会先执行:a>b?a:b,再将 10 赋值给运算结果。如果 a、b 可修改,此表达式合法;如果 a、b 不可修改,比如:定义常量、字面常量、表达式结果等,则表达式不合法。因此一定合法表述错误。
正确答案:错误
考察知识点:文件重定向与文件读写操作(超纲)
解析:#include "file.h"会先在当前源文件目录搜索头文件,再按系统路径搜索;#include <file.h>则直接按系统路径(如编译器自带的头文件目录)搜索,二者搜索策略不同。表述错误。
正确答案:错误
考察知识点:关键字 extern(超纲)、变量的定义和使用
解析:extern 是 C++ 中的关键字,主要用于声明(而非定义)变量或函数,以实现跨文件的资源共享。
在同一作用域内,变量不能多次定义,extern 声明也遵循此规则。表述错误。
三、编程题(每题 25 分,共 50 分)
本题考察模拟算法、数组。
解析:模拟题,严格按照题目的描述对数组进行操作即可。
操作次数未知,用 while 循环,操作条件是:数组还没有全为 0,用作 while 条件不好表示,因此本题中写 while(true),循环中在进行循环终止的判断。 #include <bits/stdc++.h>
using namespace std;
int n, arr[105 ];
int main () {
cin >> n;
for (int i=0 ; i<n; i++) cin >> arr[i];
int cnt=0 ;
while (true ){
int maxid=0 , minn=100 ;
for (int i=0 ; i<n; i++){
if (arr[i]>=arr[maxid]) maxid=i;
if (arr[i]!=0 && arr[i]<minn) minn=arr[i];
}
if (arr[maxid]==0 ) break ;
arr[maxid]-=minn;
cnt++;
}
cout << cnt;
return 0 ;
}
本题考察模拟算法、数组。
本题涉及知识点还是挺多的,需要知道每个月天数、闰年判断条件、如何求解已知当前的星期和往前过的天数(往后过的天数)的星期数、处理周期性问题、整数的格式化输出、周期性换行等。
题目涉及知识点比较多,有一个不会就拿不到分,以下是参考代码: #include <bits/stdc++.h>
using namespace std;
int n, months[13 ]={0 ,31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 };
int main () {
cin >> n;
cout << "MON" << " " << "TUE" << " " << "WED" << " " << "THU" << " " << "FRI" << " " << "SAT" << " " << "SUN" << endl;
int start=1 ;
if (n<9 ){
for (int i=8 ; i>=n; i--){
start-=months[i];
}
}else if (n>9 ){
for (int i=9 ; i<n; i++){
start+=months[i];
}
}
start=(start%7 +7 )%7 ;
if (start==0 ) start=7 ;
for (int i=1 ; i<start; i++){
cout << setw (3 ) << ' ' << " " ;
}
for (int i=1 ; i<=months[n]; i++){
cout << setw (3 ) << i << " " ;
if (start%7 ==0 ) cout << endl;
start++;
}
return 0 ;
}
但是本题是输出 25 年的 12 个月,所以有时间的话,纯打表这道题也是可以拿满分的。 相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online