跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

CCF-GESP 2025 年 9 月 C++ 三级真题解析

解析了 CCF-GESP 2025 年 9 月 C++ 三级认证考试的真题,涵盖单选题、判断题及编程题。内容涉及基本数据类型、运算符、数组、函数、循环控制、变量作用域及模拟算法等知识点。提供了每道题的正确答案、详细解析及参考代码,帮助考生理解考点与解题思路。

GitMaster发布于 2026/3/23更新于 2026/9/104.8K 浏览
CCF-GESP 2025 年 9 月 C++ 三级真题解析

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') 的行为

  1. 在 C 语言中:'a' 的类型是 int,sizeof('a') 通常等于 sizeof(int)(结果是 4)。
  2. 在 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 宏名 替换文本。
宏定义的类型

  1. 简单宏:
    #define PI 3.14159 //用 3.14159 替换代码中所有的 PI
    #define MAX_SIZE 100 //用 100 替换代码中所有的 MAX_SIZE
  2. 带参数宏
    #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; //maxid:满足条件的最大值下标,minn:最小值
        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; //最大值为 0,即数组中已全为 0
        arr[maxid]-=minn; //按题目要求进行操作
        cnt++; //操作次数加 1
    }
    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; //start 是月份的开始星期数,已知信息:2025 年 9 月 1 日是星期一
    if(n<9){ //9 月之前,往前计算天数
        for(int i=8; i>=n; i--){
            start-=months[i];
        }
    }else if(n>9){ //9 月之后,往后计算天数
        for(int i=9; i<n; i++){
            start+=months[i];
        }
    }
    //计算月份 n 的开始星期数,往前计算会出现负数,start%7 的结果可能是负数,通过加 7 再对 7 做取余运算规避
    start=(start%7+7)%7;
    if(start==0) start=7; //余数 0 是星期 7
    for(int i=1; i<start; i++){ //输出每月 1 号之前的空格
        cout << setw(3) << ' ' << " ";
    }
    //从 1 号到月底进行输出
    for(int i=1; i<=months[n]; i++){
        cout << setw(3) << i << " "; //占 3 个字符右对齐输出
        if(start%7==0) cout << endl; //每 7 天换行
        start++;
    }
    return 0;
}

但是本题是输出 25 年的 12 个月,所以有时间的话,纯打表这道题也是可以拿满分的。

目录

  1. 2025 年 9 月真题
  2. 一、单选题(每题 2 分,共 30 分)
  3. 二、判断题(每题 2 分,共 20 分)
  4. 三、编程题(每题 25 分,共 50 分)
  5. 本题考察模拟算法、数组。
  6. 解析:模拟题,严格按照题目的描述对数组进行操作即可。
  7. 操作次数未知,用 while 循环,操作条件是:数组还没有全为 0,用作 while 条件不好表示,因此本题中写 while(true),循环中在进行循环终止的判断。
  8. 本题考察模拟算法、数组。
  9. 本题涉及知识点还是挺多的,需要知道每个月天数、闰年判断条件、如何求解已知当前的星期和往前过的天数(往后过的天数)的星期数、处理周期性问题、整数的格式化输出、周期性换行等。
  10. 题目涉及知识点比较多,有一个不会就拿不到分,以下是参考代码:
  11. 但是本题是输出 25 年的 12 个月,所以有时间的话,纯打表这道题也是可以拿满分的。

更多推荐文章

查看全部
  • Dify 本地部署大模型智能体:Skill 开发与企业级落地实践
  • Python NumPy 入门:数据处理与科学计算基础
  • Python Django Web 框架核心功能与实战案例
  • Neo4j 图数据库安装与操作指南 (macOS)
  • 雷达信号处理中的恒虚警(CFAR)技术详解
  • UI UX Pro Max:AI 驱动的现代前端 UI 工作流实战
  • 算法实战:归并排序与数组逆序对详解
  • 零售行业信息化建设方案:痛点与架构设计
  • 自主无人机硬件搭建及 EGOPlanner 实现
  • Python 入门:编写你的第一个程序
  • Linux 部署 RocketMQ 及公网穿透实战
  • OpenClaw 开源 AI Agent 框架本地部署全流程
  • LIBERO 数据集详解:终身机器人学习与知识迁移基准
  • Java 基础语法:标识符、数据类型与变量详解
  • YOLOFuse 多模态融合算法原理与工程落地
  • Spring IoC 与 DI 核心概念及实战用法
  • uv 安装多个 Python 版本与使用方法(替代 pyenv + venv + pip)
  • ToB 垂直领域大模型的探索与实践:物流场景下的技术挑战与解决方案
  • 基于 OpenCvSharp 的无人机图像拼接技术指南
  • DeepSeek-OCR-WEBUI 部署与网页调用全流程实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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