CCF GESP C++三级 2026年3月真题详细解析
💪 备战GESP,从精练每一道题开始! 推荐使用 「GESP免费练题小程序」 进行针对性训练——智能组卷、逐题解析、薄弱点诊断,助你高效备考、稳步提升。
本文包含2026年3月CCF GESP C++三级考试全部15道单选题、10道判断题、2道编程题的完整解析,精准匹配考纲知识点,附解题思路与易错点提示,帮助考生吃透考点、掌握答题技巧。
🎯 试题解析
───── ✨ 第1题 ✨ ─────
📖 题目
如果字符变量_1的值是字符'1',那么(int)_1的值是?( )。A. 1B. -1C. 49D. +1 或者 -1
📌 大纲对应知识点:ASCII编码🎯 考查目标:掌握常见字符的ASCII码值,理解字符与整数的转换规则
📋 选项详解
⭐ 答案:C📌 知识点:ASCII编码、数据类型转换
💡 解题小贴士:记住三个关键ASCII值:空格32、'0'48、'A'65、'a'97,其余字符可通过加减推导。
───── ✨ 第2题 ✨ ─────
📖 题目
a,b是整型变量,各自有互不相同的初始值。下列程序实现了什么效果( )。
a=a^b;b=a^b;a=a^b;A. a,b的值从始至终都没有改变。B. a,b的值实现了互换。C. a,b的值互换了以后,又还回去了,相当于没有变化。D. a,b的值最后和原值不一样,没有任何意义。
📌 大纲对应知识点:位运算(异或)🎯 考查目标:掌握异或运算的特性,了解不用临时变量交换两个数的方法
📋 选项详解
⭐ 答案:B📌 知识点:位运算-异或
💡 解题小贴士:异或交换无需临时变量,但可读性较低,实际开发中优先用临时变量交换。
───── ✨ 第3题 ✨ ─────
📖 题目
关于下列正确的程序段,说法正确的是( )。
charstr1[]="Hello";charstr2[]={'H','e','l','l','0'};cout<<str1<<endl;cout<<str2<<endl;A. 字符数组str1和str2完全相同。B. 这段程序多次执行将输出不同的结果。C. 字符数组str1和str2不相等。D. 这两个赋值方式完全相同。
📌 大纲对应知识点:C++一维数组、字符串🎯 考查目标:理解C风格字符串的存储特性,区分字符串字面量和字符数组初始化的差异
📋 选项详解
⭐ 答案:C📌 知识点:C风格字符串、数组初始化
💡 解题小贴士:C风格字符串必须以'\0'结尾,否则cout输出时会越界读取内存直到遇到'\0'。
───── ✨ 第4题 ✨ ─────
📖 题目
关于以下程序段 , 说法正确的是( )。
intx=10;cout<<(x++)+(++x)<<endl;A. C++11标准中,这是未定义行为,不同的环境有可能出现不同的结果B. 22C. 21D. 20
📌 大纲对应知识点:基本运算(自增自减)🎯 考查目标:理解C++中表达式求值顺序的未定义行为规则
📋 选项详解
⭐ 答案:A📌 知识点:自增自减运算、表达式求值顺序
💡 解题小贴士:实际编程中不要在同一表达式中对同一个变量进行多次自增/自减操作,避免出现不可预期的结果。
───── ✨ 第5题 ✨ ─────
📖 题目
8位二进制下,十进制数-15的补码是( )。A. 11110000B. 10001111C. 10010000D. 11110001
📌 大纲对应知识点:数据编码(原码、反码、补码)🎯 考查目标:掌握负数补码的计算方法
📋 选项详解
⭐ 答案:D📌 知识点:补码计算
💡 解题小贴士:负数补码计算口诀:原码取反加1(符号位不变),也可以用2^n - 绝对值直接计算(n为位数)。
───── ✨ 第6题 ✨ ─────
📖 题目
三进制数2102转换成十进制是:( )。A. 63B. 65C. 67D. 69
📌 大纲对应知识点:进制转换🎯 考查目标:掌握任意进制转十进制的计算方法
📋 选项详解
⭐ 答案:B📌 知识点:进制转换(三进制转十进制)
💡 解题小贴士:任意进制转十进制,从右往左各位权重是基数的0次、1次、2次幂,依次累加即可。
───── ✨ 第7题 ✨ ─────
📖 题目
二进制数10110101是某数的8位补码,该数的十进制是( )。A. -73B. -75C. -77D. 75
📌 大纲对应知识点:数据编码(原码、反码、补码)🎯 考查目标:掌握补码转十进制的计算方法
📋 选项详解
⭐ 答案:B📌 知识点:补码转十进制
💡 解题小贴士:8位补码转负数也可以用公式:值 = 补码的无符号值 - 256,本题10110101无符号值是181,181-256=-75。
───── ✨ 第8题 ✨ ─────
📖 题目
已知unsigned char c = 0x0F;(十六进制0F = 二进制00001111),执行c = c << 3;后,c的十进制值是:( )。A. 64B. 72C. 80D. 120
📌 大纲对应知识点:位运算(左移)🎯 考查目标:掌握左移运算的规则和计算方法
📋 选项详解
⭐ 答案:D📌 知识点:位运算-左移
💡 解题小贴士:左移n位相当于乘以2^n(无溢出时),本题0x0F=15,15*8=120,直接计算更快捷。
───── ✨ 第9题 ✨ ─────
📖 题目
补码的情况下,关于按位取反运算,用笔计算的情况下,以下说法错误的是:( )A. ~5的结果是-6(int类型,32位)B. ~0的结果是0(int类型,32位)C. ~(-3)的结果是2(int类型,32位)D. ~8的结果是-9(int类型,32位)
📌 大纲对应知识点:位运算(按位取反)🎯 考查目标:掌握按位取反运算的规则和结果计算
📋 选项详解
⭐ 答案:B📌 知识点:位运算-按位取反
💡 解题小贴士:按位取反运算有通用公式:~x = -x -1,直接套用公式可快速计算结果。
───── ✨ 第10题 ✨ ─────
📖 题目
执行以下C++代码后,sub的值是( )。
stringstr="GESP2026";stringsub=str.substr(4,2);A. 20B. 02C. 2026D. 026
📌 大纲对应知识点:字符串及其函数🎯 考查目标:掌握string类substr函数的用法
📋 选项详解
⭐ 答案:A📌 知识点:字符串函数-substr
💡 解题小贴士:C++ string下标从0开始,substr(pos, len),如果len省略则取到字符串末尾。
───── ✨ 第11题 ✨ ─────
📖 题目
执行以下代码后,输出结果是:( )。
intarr[]={5,10,15,20,25,30};intcount=sizeof(arr)/sizeof(arr[0]);cout<<count;A. 4B. 6C. 24D. 30
📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握sizeof计算数组长度的方法
📋 选项详解
⭐ 答案:B📌 知识点:数组长度计算
💡 解题小贴士:sizeof(数组名)得到整个数组的总字节数,该方法仅在数组定义的作用域内有效,数组作为函数参数时会退化为指针,无法用该方法计算长度。
───── ✨ 第12题 ✨ ─────
📖 题目
执行以下代码后,输出结果是:( )。
chars[10]="abcde";inta=sizeof(s)/sizeof(s[0]);intb=strlen(s);cout<<a-b;A. 4B. 5C. 6D. 10
📌 大纲对应知识点:C++一维数组、字符串🎯 考查目标:区分sizeof和strlen的作用,掌握C风格字符串的存储特性
📋 选项详解
⭐ 答案:B📌 知识点:sizeof、strlen的区别
💡 解题小贴士:sizeof计算的是变量/类型所占内存的总大小,strlen计算的是C风格字符串的实际长度(到'\0'为止,不含'\0')。
───── ✨ 第13题 ✨ ─────
📖 题目
以下问题中,最不适合用枚举法解决的是:( )A. 找出1~100之间所有能被7整除的数B. 找出100~200之间的所有质数C. 计算1+2+3+…+1000的和D. 找出三位数中个位、十位、百位数字之和等于10的数
📌 大纲对应知识点:算法:枚举法🎯 考查目标:理解枚举法的适用场景,区分枚举法与数学公式法的效率差异
📋 选项详解
⭐ 答案:C📌 知识点:枚举法适用场景
💡 解题小贴士:当问题可以用数学公式直接得出结果时,优先用公式法,时间复杂度O(1)远优于枚举的O(n)。
───── ✨ 第14题 ✨ ─────
📖 题目
用枚举法解决“鸡兔同笼问题:头共35个,脚共94只,求鸡和兔的数量”,以下枚举逻辑最合理的是:( )A. 枚举鸡的数量x(0~35),兔的数量y=35-x,判断2x + 4*y == 94B. 枚举兔的数量y(0~94),鸡的数量x=35-y,判断2x + 4*y == 94C. 枚举所有整数x(0-100)和y(0-100),判断x+y==35 && 2*x+4*y==94D. 枚举脚的总数sum(0~94),判断sum == 94
📌 大纲对应知识点:算法:枚举法🎯 考查目标:掌握枚举法的优化方法,减少枚举范围提高效率
📋 选项详解
⭐ 答案:A📌 知识点:枚举法优化
💡 解题小贴士:枚举法优化核心:利用题目约束条件尽可能缩小枚举范围,减少枚举变量的数量。
───── ✨ 第15题 ✨ ─────
📖 题目
模拟“字符串加密”:规则为“每个字符ASCII码+3,若超过z(122)则从a重新开始”,以下代码中正确的条件判断是:( )
for(inti=0;i<str.length();i++){// 需补充条件:_______________________else{str[i]+=3;}}A. if (str[i]> 122) str[i] = str[i] + 3 - 26;B. if (str[i] > 122) str[i] = str[i] - 26;C. if (str[i] + 3 > 122) str[i] = str[i] - 26;D. if (str[i] + 3 > 'z') str[i] = 'a' + (str[i] + 3 - 'z') - 1;
📌 大纲对应知识点:算法:模拟法、ASCII编码🎯 考查目标:掌握模拟算法的逻辑实现,理解循环移位的计算方法
📋 选项详解
⭐ 答案:D📌 知识点:模拟算法、字符循环移位
💡 解题小贴士:字母循环移位通用公式:偏移后字符 = 'a' + (原字符 - 'a' + 偏移量 + 26) % 26,可自动处理溢出情况,无需单独判断。
───── ✨ 判断题第1题 ✨ ─────
📖 题目
定义int arr[5] = {1,2,3};,则arr[3]的值为0,arr[5]是合法下标。
📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握数组初始化规则和下标范围
📋 解析
答案:错误。数组初始化时未显式赋值的元素会自动初始化为0,因此arr[3]确实是0;但数组arr的长度为5,合法下标范围是0~4,arr[5]越界,属于非法访问。
💡 解题小贴士:C++数组下标从0开始,长度为n的数组最大合法下标是n-1,越界访问会导致未定义行为。
───── ✨ 判断题第2题 ✨ ─────
📖 题目
定义double arr[10];,未手动初始化时,数组中所有元素的默认值为0.0。
📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握局部数组和全局数组的初始化规则
📋 解析
答案:错误。局部数组(函数内定义)未初始化时元素值是随机的垃圾值;只有全局数组或静态数组未初始化时才会默认初始化为0。
💡 解题小贴士:局部变量(包括数组)不会自动初始化,使用前必须手动赋值,否则会出现不可预期的结果。
───── ✨ 判断题第3题 ✨ ─────
📖 题目
定义int arr[] = {1,2,3};,则sizeof(arr)的结果为12(int占4字节)。
📌 大纲对应知识点:C++一维数组🎯 考查目标:掌握sizeof计算数组大小的方法
📋 解析
答案:正确。数组arr有3个int元素,每个int占4字节,总大小为3*4=12字节,sizeof(arr)结果为12。
💡 解题小贴士:隐式长度数组的长度由初始化列表的元素个数决定,sizeof可正确计算总字节数。
───── ✨ 判断题第4题 ✨ ─────
📖 题目
下面的流程图是用来求1+2+3+…+10的和。请判断:这个流程图的逻辑正确还是错误?

(注:流程图描述:初始化s=0,i=1,判断i≤10,是则s=s+i,i=i+1,循环,否则输出s)
📌 大纲对应知识点:流程图的概念与描述🎯 考查目标:掌握流程图的逻辑分析
📋 解析
答案:正确。该流程图初始化和为0,计数变量从1开始,每次累加计数变量到和中,计数加1,直到超过10停止,逻辑完全正确,结果为55。
💡 解题小贴士:累加求和的核心是循环变量从初始值到终止值依次累加,注意循环边界是否正确。
───── ✨ 判断题第5题 ✨ ─────
📖 题目
下面流程图的功能是计算5对2取余数,输出结果为1。

(注:流程图描述:a=5,b=2,r=a%b,输出r)
📌 大纲对应知识点:流程图的概念与描述🎯 考查目标:掌握流程图的逻辑分析
📋 解析
答案:正确。5除以2的余数是1,该流程图逻辑正确,输出结果为1。
💡 解题小贴士:取余运算a%b的结果是a除以b的余数,符号与a相同,正数取余结果为正。
───── ✨ 判断题第6题 ✨ ─────
📖 题目
已知大写字符A的ASCII编码的十六进制表示为0x41,计算字符m的ASCII编码的八进制表示为155(八进制)。
📌 大纲对应知识点:ASCII编码、进制转换🎯 考查目标:掌握ASCII码的计算和进制转换
📋 解析
答案:正确。'A'的ASCII是65(0x41),'a'是97,'m'是97+12=109。十进制109转八进制:109÷8=13余5,13÷8=1余5,1÷8=0余1,结果为155(八进制)。
💡 解题小贴士:小写字母比对应的大写字母ASCII码大32,'a'是97,'m'是第13个小写字母,所以97+12=109。
───── ✨ 判断题第7题 ✨ ─────
📖 题目
在C++位运算中,各种不同的运算符有优先级的区分,使用括号能够解决优先级的问题。
📌 大纲对应知识点:位运算🎯 考查目标:掌握位运算符的优先级规则
📋 解析
答案:正确。位运算符优先级不同(如~优先级高于&,&高于^,^高于|),复杂表达式中使用括号可以明确运算顺序,避免优先级导致的逻辑错误。
💡 解题小贴士:编写位运算表达式时,优先使用括号明确运算顺序,不要依赖默认优先级,提高代码可读性。
───── ✨ 判断题第8题 ✨ ─────
📖 题目
由于在0~255范围内,char类型和int类型可以互换,因此在这里x和y相等。
charx='1';inty=1;📌 大纲对应知识点:ASCII编码、数据类型转换🎯 考查目标:区分字符'1'和数字1的存储差异
📋 解析
答案:错误。char类型x存储的是字符'1'的ASCII码49,int类型y存储的是数字1,两者值不相等。
💡 解题小贴士:字符类型存储的是字符的ASCII码值,字符'0'~'9'对应的ASCII码是48~57,与数字0~9不相等。
───── ✨ 判断题第9题 ✨ ─────
📖 题目
在C++语言中,表达式((0xf0 + 0x15) == 255)的值为true。
📌 大纲对应知识点:进制转换🎯 考查目标:掌握十六进制数的运算
📋 解析
答案:正确。0xf0是十进制240,0x15是十进制21,240+21=261,261≠255?哦不对,0xf0是240,0x15是116+5=21,240+21=261,所以表达式值为false?不对,等下,哦不,0xf0是1516=240,0x15是21,240+21=261,确实不等于255,所以答案是错误?不对,等下题目说值为true,所以判断是错?哦对,正确答案是错误。哦抱歉刚才算错了。重新解析:答案:错误。十六进制0xf0转换为十进制是15×16=240,0x15转换为十进制是1×16+5=21,两者相加为261,不等于255,因此表达式值为false。
💡 解题小贴士:十六进制转十进制:各位数字乘以16的幂次累加,A~F对应10~15。
───── ✨ 判断题第10题 ✨ ─────
📖 题目
如果a为int类型的变量,且a的二进制最低位为0,则表达式((a & 3 & 1) == 0)的值为true。
📌 大纲对应知识点:位运算(与)🎯 考查目标:掌握按位与运算的应用
📋 解析
答案:正确。按位与1可以提取二进制最低位,a的最低位为0,则a&1=0,再与3运算结果还是0,因此0==0结果为true。
💡 解题小贴士:判断整数奇偶性可以用a&1,结果为1是奇数,为0是偶数,效率比取模运算更高。
───── ✨ 编程题1:二进制回文串 ✨ ─────
📖 题目
对于一个正整数n,我们将其转换为不含前导零的二进制表示,如果这个二进制序列从左向右读与从右向左读完全相同,则称该数为二进制回文数。例如,9的二进制表示为1001,是二进制回文数;12的二进制表示为1110,不是二进制回文数。你的任务是:给定一个正整数n,计算在1到n的范围内二进制回文数的数量。
输入格式:
输入一行,包含一个正整数n。
输出格式:
输出一行,包含一个数,表示在1到n的范围内二进制回文数的数量。
样例输入
15样例输出
6样例解释
1到15范围内1、3、5、7、9、15是二进制回文数。
数据范围
1 ≤ n ≤ 10^6
📌 大纲对应知识点:枚举法、模拟法、一维数组🎯 考查目标:能够运用枚举法遍历范围,模拟二进制转换和回文判断过程
📋 解题思路
- 枚举遍历
:从1到n依次判断每个数是否是二进制回文数 - 二进制转换
:对每个数,通过除2取余的方式将二进制位存储到数组中 - 回文判断
:用双指针法比较数组首尾对应位置的二进制位是否全部相同 - 计数统计
:统计符合条件的回文数数量并输出
📝 参考代码
#include<iostream>usingnamespacestd;intmain(){intn,a[50]={0},ans=0;cin>>n;for(inti=1;i<=n;i++){intt=i,pos=0;// 转换为二进制,存储到数组a中while(t){a[pos++]=t%2;t/=2;}// 判断是否为回文boolok=true;for(intj=0;j<pos/2;j++){if(a[j]!=a[pos-j-1]){ok=false;break;}}if(ok)ans++;}cout<<ans;return0;}💡 解题小贴士:n最大为1e6,枚举1e6次完全在时间限制内,无需更复杂的回文构造算法,暴力枚举足够高效。二进制位存储时余数是从低位到高位存储,但回文判断不影响,因为回文正读反读都一样。
───── ✨ 编程题2:凯撒密码 ✨ ─────
📖 题目
凯撒密码是一种替换加密技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B被替换成E,以此类推,X被替换成A,Y被替换成B,Z被替换成C。这个加密方法是以罗马共和时期凯撒名字命名的。现在给你一个已破解的凯撒密码明文与密文,与一个有相同偏移量的未破解凯撒密码密文,请你帮忙破解它。
输入格式
输入共三行:第一行包含一个字符串,表示已破解的凯撒密码明文;第二行包含一个字符串,表示已破解的凯撒密码密文;第三行包含一个字符串,表示待破解的凯撒密码密文。
输出格式
输出一行,包含一个字符串,表示待破解的凯撒密码对应的明文。
样例输入
ABCDEFGVWXYZDEFGHIJYZABCWKHTXLFNEURZQIRAMXPSVRYHUWKHODCBGRJ样例输出
THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG样例解释
样例1中,通过已破解的密码得出偏移量为'D'-'A'=3,因此,对未破解部分进行逆向偏移:密文中的W对应明文中的T('W'-3='T'),密文中的K对应明文中的H('K'-3='H'),以此类推。
数据范围
保证密码长度均不超过1000,所有字符串由大写字母组成。
📌 大纲对应知识点:模拟法、字符串及其函数🎯 考查目标:能够运用模拟法实现凯撒密码的解密逻辑,掌握字符偏移的循环处理
📋 解题思路
- 计算偏移量
:通过已知的明文和密文的第一个字符计算偏移量d = 明文[0] - 密文[0] - 偏移量标准化
:将偏移量调整为0~25之间的正数,避免负数导致的错误 - 解密待破解密文
:对每个字符,加上偏移量后模26,转换为对应的明文字符
📝 参考代码
#include<iostream>#include<string>usingnamespacestd;intmain(){strings1,s2,s3;cin>>s1>>s2>>s3;// 计算偏移量:明文 = 密文 + d (mod 26)intd=s1[0]-s2[0];// 确保偏移量为正的0~25之间d=(d%26+26)%26;for(inti=0;i<s3.length();i++){intch=(s3[i]-'A'+d)%26;cout<<(char)(ch+'A');}return0;}💡 解题小贴士:偏移量计算要考虑正负情况,用(d % 26 + 26) % 26可以确保结果始终在0~25之间,避免负数取模的异常。字符运算时先转换为0~25的相对值,运算后再转回字符,逻辑更清晰。
📝 学习建议
本次C++三级考试核心考点集中在数据编码(原码反码补码)、进制转换、位运算、一维数组、字符串操作、枚举法和模拟法,这些都是三级考纲明确要求的重点内容。
复习建议:1. 熟练掌握原码/反码/补码的转换和计算,记住常用位运算的特性和应用场景2. 多练习进制转换题,做到快速准确完成二进制、八进制、十进制、十六进制之间的互转3. 掌握C风格字符串和string类的常用函数,区分sizeof和strlen的区别4. 枚举法和模拟法是三级算法题的核心,多练习相关题型,学会优化枚举范围、清晰梳理模拟逻辑
💪 更多GESP历年真题、专项练习题可前往「GESP练题小程序」进行训练,智能错题本、考点测评助力你高效备考,顺利通关!