点击上方蓝字·关注我们



CCF编程能力等级认证,英文名Grade Examination of Software Programming(以下简称GESP),由中国计算机学会发起并主办,是为计算机和编程学习者提供学业能力验证的平台。GESP旨在提升青少年计算机编程能力,培训机构编编程教育水平,推广和普及计算机和编程教育。
GESP考察语言为图形化(Scratch)编程、Python编程及C++编程,主要考察学生掌握相关编程知识和操作能力,熟悉编程各项基础知识和理论框架,通过设定不同等级的考试目标,让学生具备编程从简单的程序到复杂程序设计的编程能力,为后期专业化编程学习打下良好基础。
本次为大家带来的是2026年3月C++四级认证真题解析。
C++ 四级
2026年3月
一、单选题(共15题,每题2分,共30分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
答案 | B | B | B | B | A | B | B | B | B | B | B | C | B | B | A |
【第1题】执行下面程序后,输出为( )

A. 2 12
B. 6 12
C. 6 4
D. 12 6
【答案】B
【考察知识点】函数的默认参数
【解析】函数f的形参x设置了默认值2,当调用f()时没有传入实参,就会使用默认值2。计算:2 * 3 = 6
调用f(4)时传入了实参4,会覆盖默认值,x的值为4。计算:4 * 3 = 12
【第2题】执行下面代码后,输出为( )

A. 5 5
B. 12 12
C. 12 5
D. 5 12
【答案】B
【考察知识点】指针与多级指针
【解析】**q的含义:
*q:对q解引用,得到p的值(也就是&a,即变量a的地址)
**q:再对*q解引用,得到的就是变量a本身
所以**q += 7 等价于a += 7
【第3题】已知:

则表达式*(*(p+2)+1)的值为( )
A. 6
B. 10
C. 9
D. 11
【答案】B
【考察知识点】二维数组与指针运算
【解析】表达式为:*(*(p + 2) + 1)
1.分析p + 2
p是数组指针,类型为int (*)[4],它指向的是一个包含4个int的数组。
指针运算中,p + n 表示跳过n个指向的数据类型。
所以p + 2 指向了二维数组a的第3行(即a[2]的地址)。
2.分析*(p + 2)
根据指针解引用规则,*(p + 2) 等价于p[2],代表第3行的数组名。
在表达式中,数组名会退化指向第0个元素的指针。即它指向了a[2][0]。
3.分析*(p + 2) + 1
这是在第3行首地址的基础上偏移1个位置。
指向了 第 3行第1列 的元素,即地址 &a[2][1]。
4.分析最外层*(...)
对a[2][1]的地址进行解引用,得到具体的数值。
a[2][1]的值为10。
【第4题】执行下面程序后,输出为( )

A. 2 3 4
B. 1 3 4
C. 2 1 4
D. 1 1 1
【答案】B
【考察知识点】函数参数传递(值、引用、指针)
【解析】
a(值传递):修改副本,不影响实参x,x保持为1。
b(引用传递):直接操作 y,y += 2 变为 3。
*c(指针传递):通过地址操作 z,z += 3 变为 4。
【第5题】执行下面程序后输出为( )

A. 12 3
B. 10 5
C. 12 5
D. 10 3
【答案】A
【考察知识点】变量作用域与作用域解析符
【解析】
main函数内定义了局部变量int x = 10,它会屏蔽全局变量x。
f(x)以引用方式传递局部变量x,函数内x += 2 会直接修改它,局部x变为12。
::x是全局作用域解析符,访问的是全局变量x,其值始终为3。
最终输出:12 3。
【第6题】下列关于结构体初始化的写法,正确的是( )
A.

B.

C.

D.

【答案】B
【考察知识点】结构体的定义与初始化
【解析】
A错误:结构体初始化不能用圆括号(1,2),这种写法不符合C++语法。
C错误:new会返回堆上的指针,不能直接赋值给栈上的结构体变量Point p,类型不匹配。
D错误:尖括号<1,2>不是结构体初始化的合法语法。
【第7题】执行下面代码后输出为( )

A. 11 12
B. 1 12
C. 11 2
D. 1 2
【答案】B
【考察知识点】结构体参数传递
【解析】
g(s)是值传递,函数内修改的是结构体s的副本,不影响原变量,s.a保持为1。
h(s)是引用传递,函数内直接修改原变量,s.b += 10 后变为2 + 10 = 12。
最终输出:1 12。
【第8题】关于递推算法的描述,正确的是( )
A.递推表现为函数自己调用自己
B.递推从已知初值出发,利用递推关系逐步推出后续结果
C.递推只能用于指数复杂度问题
D.递推一定需要回溯
【答案】B
【考察知识点】递推算法
【解析】
A错误:函数自己调用自己是递归的特征,不是递推。
B正确:递推的核心就是从已知初值出发,利用递推关系逐步推出后续结果(比如斐波那契数列)。
C错误:递推可以把很多指数复杂度问题优化成线性复杂度,不是 “只能用于指数复杂度问题”。
D错误:递推是从前往后迭代计算,不需要回溯;回溯是递归/搜索算法的特征。
【第9题】执行climb (6) 的返回值为( )

A. 8
B. 13
C. 5
D. 10
【答案】B
【考察知识点】递推与斐波那契数列
【解析】循环从前两项逐步往后加,算出第6项就是答案。
【第10题】某排序算法对如下数据排序(按score升序),则下面关于该排序算法稳定性的描述中,说法正确的是( )
初始:(90,'A'), (90,'B'), (80,'C'), (90,'D')
排序后:(80,'C'), (90,'A'), (90,'B'), (90,'D')
A.不稳定,因为出现了相同分数
B.稳定,因为相同score的相对顺序保持为A在B前、B在D前
C.不稳定,因为C跑到前面了
D.无法判断
【答案】B
【考察知识点】排序算法的稳定性
【解析】稳定排序的定义:排序后,关键字相同的元素,相对顺序和排序前保持不变。
【第11题】下面代码试图把数组按升序进行 “插入排序”,横线处应填写( )

A. a[j] < key
B. a[j] > key
C. a[j+1] > key
D. a[j] == key
【答案】B
【考察知识点】插入排序算法
【解析】插入排序升序时,while循环需要不断把比key大的元素往后挪,给key腾位置。
循环条件要判断:j >= 0 且a[j] > key 时,执行a[j+1] = a[j](后移)。
横线处应填:a[j] > key。
【第12题】下列代码段的时间复杂度为( )

A. O(n)
B. O(n log n)
C. O(n²)
D. O(2ⁿ)
【答案】C
【考察知识点】算法时间复杂度分析
【解析】代码是两层嵌套循环,总执行次数约为n * n,时间复杂度为O(n²)。
【第13题】下面哪种方式不能实现将字符串Welcome to 2026! 输出重定向到文件log.txt( )

A.

B.

C.

D.

【答案】B
【考察知识点】文件操作与输出重定向
【解析】B选项 只创建了文件流对象outFile,但后续cout的输出仍然打印到控制台,没有写入文件,无法实现重定向。
【第14题】执行下面程序,输出结果是( )

A. A
B. B
C.程序崩溃
D.无输出
【答案】B
【考察知识点】C++异常处理
【解析】异常抛出:调用divi(10,0)时,b=0触发throw 0,抛出的是int类型的异常。
异常匹配:
catch(const char* msg)只能捕获字符串类型异常,不匹配,跳过。
catch(int)专门捕获int类型异常,匹配成功,执行cout << "B";。
最终输出为B。
【第15题】下列函数实现排行榜中单个元素的位置调整(类似插入排序的相邻搬移)。当某玩家分数增加,需将其向前移动时,while循环的条件应为( )

A. i > 0 && cur.score > players[i-1].score
B. i > 0 && cur.score < players[i-1].score
C. i < n-1 && cur.score > players[i+1].score
D. i < n-1 && cur.score < players[i+1].score
【答案】A
【考察知识点】数组元素移动与排序
【解析】边界限制:i > 0 防止数组下标越界。
前移条件:分数要向前移动,必须当前玩家分数高于前一位玩家,即 cur.score > players[i-1].score。
综上,条件为:i > 0 && cur.score > players[i-1].score。
二、判断题(共10题,每题2分,共20分)
题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
答案 | √ | √ | × | × | √ | × | √ | × | × | × |

【答案】√
【考察知识点】引用传递
【解析】add10函数的参数是引用传递(int &x),函数内对x的修改会直接作用于原变量a。初始a=5,调用add10(a)后,a += 10,结果为15。
【第2题】引用一旦绑定某个变量,就不能再绑定其他变量。()
【答案】√
【考察知识点】引用的基本特性
【解析】引用初始化后不可重新绑定,为C++标准规则。
【第3题】执行下面代码,输出结果为5。

【答案】×
【考察知识点】二维数组指针运算
【解析】二维数组按行优先存储,从&a[0][1]到&a[1][2],地址相差4个int元素,指针相减结果为4
【第4题】下面程序可以正常编译并输出10。

【答案】×
【考察知识点】函数重载与默认参数冲突
【解析】calc(5)调用存在歧义:既可以匹配int calc(int x),也可以匹配int calc(int x, int y=10)。编译器无法确定调用哪个版本
【第5题】下面程序执行后输出2010。

【答案】√
【考察知识点】全局变量与局部变量
【解析】f()函数内的局部变量x=20会屏蔽全局变量,执行cout << x 输出20。
main函数中访问的是全局变量x=10,执行cout << x 输出10。
【第6题】在C++中,如果声明了一个指针变量但没有显式初始化,该指针会自动被初始化为nullptr。()
【答案】×
【考察知识点】指针的初始化
【解析】在C++中,未显式初始化的局部指针变量,其值是不确定的随机垃圾值,不会自动初始化为nullptr
【第7题】下面代码没有语法错误。

【答案】√
【考察知识点】C++基础语法
【解析】代码语法合法,可正常编译。
【第8题】下面程序能够把Hello写入data.txt文件中。

【答案】×
【考察知识点】文件写入操作
【解析】cout << "Hello"; 会把内容输出到控制台(屏幕),而不是写入文件
【第9题】由于选择排序和插入排序的时间复杂度均为O (n²),在任何实际场景下两者的性能表现几乎相同,可以互相替代。()
【答案】×
【考察知识点】排序算法性能对比
【解析】插入排序在数据接近有序时,时间复杂度可以接近O (n),实际效率很高。
选择排序无论数据初始状态如何,都需要固定的n (n-1)/2 次比较,性能不会因数据有序而提升
【第10题】下面用递推方式计算斐波那契数列第n项的程序,时间复杂度是O (2ⁿ)。

【答案】×
【考察知识点】递推算法复杂度
【解析】这是递推版的斐波那契实现,不是递归,时间复杂度为O(n)
三、编程题(每题25分,共50分)
编程题1
试题名称:山之谷
时间限制:1.0 s
内存限制:512.0 MB
题目描述
现有一片山地,可以视为一个N行M列的网格图,第i行j列的海拔为hi,j。如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多8个方向)的海拔,则称该单元格为山谷。请你数一数该片山地中有多少山谷。
输入格式
第一行包含2个整数N, M,表示山地的大小。之后N行,每行包含M个整数hi,1, hi, 2,…… hi,M,表示海拔。
输出格式
输出1行,包含1个整数C,表示山谷的数量。
样例
输入样例

输出样例
样例解释
样例1如图所⽰,绿⾊单元格代表⼭⾕:

数据范围
保证1≤N, M ≤100 ,1≤hi,j≤105
【考察知识点】二维数组、枚举
【解析】
核心题意:统计网格中8邻域内海拔最低的山谷数量。
解题思路:
遍历每个单元格,检查其 8 个相邻位置;
若当前单元格海拔≤所有相邻海拔,即为山谷;
给网格外围赋值极大值,避免边界越界判断。
算法:双重循环枚举+ 8 方向检查
【参考程序】

编程题2
试题名称:礼盒排序
时间限制:1.0 s
内存限制:512.0 MB
题目描述
商店推出了许多礼盒,每个礼盒中包含k件商品,每件商品都有⼀个价格。
现在需要对这些礼盒进⾏排序,排序规则如下:
1.先按礼盒总价格从⼩到⼤排序;
2.如果总价格相同,按礼盒中最贵商品的价格从⼩到⼤排序;
3.如果仍然相同,按礼盒中最便宜商品的价格从⼩到⼤排序;
4.如果仍然相同,按礼盒编号从⼩到⼤排序。
请输出排序后的礼盒编号。
输入格式
第⼀⾏包含两个整数n和k,分别表⽰礼盒数量和每个礼盒中商品的数量。
接下来n⾏,每⾏包含k个整数,第i⾏表⽰第i个礼盒中各商品的价格。
输出格式
输出⼀⾏,包含排序后的礼盒编号(编号从1开始),⽤空格分隔。
样例
输入样例
输出样例
样例解释
4个礼盒分别为:

排序过程:
1.按总价排序,3号礼盒总价最⼩;
2.其余总价均为10,再按最⼤值排序,4号最⼤值更⼩;
3. 1号和2号最⼤值相同,再按最⼩值排序,2号更⼩。
最终顺序为:3 4 2 1
数据范围
保证1≤n≤103,1≤k ≤10,商品价格≤104
【考察知识点】结构体排序
【解析】
核心题意:按总价→最高价→最低价→编号的优先级排序礼盒,输出编号。
解题思路:
用结构体存储每个礼盒的总价、最大 / 最小价格、编号;
自定义排序规则,严格按题目 4 个条件依次比较;
排序后直接输出礼盒编号。
【参考程序】
策划:GESP技术委员会副主席 刘晓庆
技术支持:朱浩淼
【关于GESP第14次认证】

认证语言:
C++/Python/图形化编程

报名及交费时间:
2026年4月15日17:00-6月16日24:00

准考证下载及打印时间:
2026年6月23日9:30-6月27日9:30

认证时间:
1-4级 2026年6月27日 上午09:30-11:30
5-8级 2026年6月27日 下午13:30-16:30

认证方式:
全国各GESP考点内上机考试

报名方式:
登录GESP网站(https://gesp.ccf.org.cn/)进行报名或“CCF GESP”微信公众号报名。

认证安排及收费标准:
认证时间 | 认证级别 | 认证语言 | 认证费用 |
上午9:30-11:30 | 一级 | C++/Python/图形化 | 300元/人 |
上午9:30-11:30 | 二级 | C++/Python/图形化 | 320元/人 |
上午9:30-11:30 | 三级 | C++/Python/图形化 | 340元/人 |
上午9:30-11:30 | 四级 | C++/Python/图形化 | 360元/人 |
下午13:30-16:30 | 五级 | C++/Python | 380元/人 |
下午13:30-16:30 | 六级 | C++/Python | 400元/人 |
下午13:30-16:30 | 七级 | C++/Python | 420元/人 |
下午13:30-16:30 | 八级 | C++/Python | 440元/人 |

报名流程
📍第一种方式:GESP网站报名流程
步骤1:在电脑上使用Google Chrome浏览器/Microsoft Edge浏览器/Firefox浏览器进入GESP网站 (https://gesp.ccf.org.cn) ,参加过GESP认证的考生可直接点击【登录】;未参加过GESP的考生需先点击【注册】完成新用户注册→点击【登录】。
步骤2:进入认证列表,在对应的认证名称后点击【立即报名】。
步骤3:按顺序填写考生的报名信息,身份证信息、语言等级都填写完整后,选择考点,所选城市/区没有考点信息显示,则说明该地区暂无考点,请勾选其他城市/区。考点剩余机位数大于0,则可以报名该考点。填写完成后,点击【提交报名】。
步骤4:在报名信息确认界面,仔细核对报名信息后,点击【确认报名】。
注:如需修改考生信息,请点击【修改报名】。
步骤5:进入交费界面,选择支付方式(支付宝/微信)后,点击【确认】,然后扫码支付报名费用。
注:部分省市的考位数量变化较快,如交费页面提示该考点已报满,请点击【我的报名】后点击【取消报名】,重新填写报名信息后再提交。
步骤6:完成支付,认证报名成功。
步骤7:等待审核,已交费考生信息会依次审核。
步骤8:在指定时间内下载、打印准考证。
步骤9:参加认证。
📍第二种方式:GESP公众号报名流程
点击“CCF GESP”公众号底部菜单栏【GESP】→【报名认证】,同意授权,进行登录。登录后,其余报名步骤可参考“第一种方式”指引完成报名。


【联系我们】
1. GESP微信:关注“CCF GESP”公众号,点击“GESP小助手”即可交流。
2. GESP邮箱:gesp@ccf.org.cn
注:请在邮件中详细描述咨询的问题并留下考生的联系方式及姓名、身份证件号,以便及时有效处理。
3. GESP电话:0512-67656856
咨询时间:周一至周五(法定节假日除外): 上午 8:30-12:00;下午 13:00-17:30
扫描下方二维码关注GESP公众号,了解更多资讯

