CCF-GESP 2025年3月 等级认证 C++一级真题+解析+知识点总结
CCF-GESP 2025年3月C++一级真题+解析+知识点拓展
一、单选题(每题2分,共30分)

答案:D
考察知识点:【计算机应用常识(AI 技术的社会应用)、逻辑思维能力。】
【解析】
选项 A :《哪吒 2》被描述为 “贺岁片” 且 “进入全球票房榜”,显然属于影视作品范畴,而非操作系统。
选项 B 分析:“DeepSeek” 是人工智能(AI)领域的技术或产品
选项 C:《哪吒 2》作为电影,其核心功能是通过剧情、画面等内容提供文化娱乐,不具备 “生成软件” 的技术能力。
选项 D :若 “DeepSeek” 是人工智能系统(如 AI 创作工具),则其完全可能具备基于给定场景(如《哪吒 2》的画面、角色设定等)生成剧情脚本的能力。

答案:D
考察知识点:集成开发环境(IDE)对源代码文件编辑操作的理解,区分代码编辑与非代码内容插入。
解析:在编辑源代码文件时,修改变量定义、保存修改、撤销修改都是常规代码编辑操作;插入执行截图不属于代码编辑范畴,无法在源代码编辑时执行,选D。

答案:D
考察知识点:C++变量命名规则(由字母、数字、下划线组成,且不能以数字开头,不能含特殊字符 )。
解析:A含-非法;B含$非法;C含%非法;D由下划线、字母、数字组成,合法,选D。

答案:C
考察知识点:【C++ 语言关键字的识别与区分】
【解析】
A. abs:并非 C++ 关键字,而是 C/C++ 标准库中的函数,用于计算整数的绝对值。
B. cin:不是关键字,而是 C++ 标准输入流对象,用于从标准输入设备读取数据(如cin >> x;)。
C. do:是 C++ 关键字,用于构成do-while循环语句(语法为do { 语句 } while (条件);),属于流程控制关键字。
D. endl:不是关键字,而是 C++ 标准库中的操纵符,用于输出换行并刷新缓冲区(如cout << endl;)。
关键字与标准库元素的区分
C++ 关键字具有固定语法功能(如do、if、while等),而cin、endl、abs等属于标准库提供的工具,本质是类对象或函数,并非语言关键字。


答案:C
考察知识点:break 语句的使用场景(只能在循环语句或 switch 语句中使用 )。
解析:break 用于跳出循环或 switch,A 是 do - while 循环,B 是 for 循环,D 是 switch,都可配合 break;C 是 if 条件判断,break 不能用于 if,会编译报错 。

答案:B
考察知识点:printf格式化输出,包括宽度控制(%2d 占两位宽度 )、补零(%02d 不足两位补零 )及普通字符输出。

答案:C
考察知识点:C++ 字符串字面量的语法规则(双引号用于界定字符串,单引号用于界定字符 )
解析:C++ 中,双引号用于表示字符串字面量,单引号用于字符。原代码中双引号括起的是字符串,不能直接替换为两个单引号(两个单引号是不合法的字符组合形式,无法正确表示字符串 );A、B 是合法修改字符串内容,D 虽然不常规但语法上三个双引号在 C++ 标准里不影响(实际是错误写法,这里按题目逻辑,C 是明确错误 ),所以错误的是 C。


答案:D
考察知识点:C++ 中算术运算符的优先级与结合性(除法 / 和取余 % 同优先级,从左到右计算 )
解析:先算 16 / 4 = 4,再算 4 % 2 = 0,所以结果是 0 ,选 D 。
知识点拓展
以下是 C++ 考试中常考的运算符优先级(从高到低,搭配典型场景速记 ):
一、高频必记(优先级从高到低 )
| 优先级 | 运算符 | 场景示例 | 结合性 |
|---|---|---|---|
| 1(最高) | ()(函数/表达式分组)、[](数组下标) |
a = (3 + 2) * 5;(括号改变顺序) |
左→右 |
| 2 | ++(前缀自增)、--(前缀自减)、!(逻辑非)、~(按位取反)、*(解引用)、&(取地址) |
int b = ++a;(先自增再赋值) |
右→左 |
| 3 | *(乘法)、/(除法)、%(取模) |
16 / 4 % 2(先除后取模) |
左→右 |
| 4 | +(加法)、-(减法) |
a + b * c(先乘后加减) |
左→右 |
| 5 | <<(左移)、>>(右移) |
num << 2(位运算,优先级高于关系运算) |
左→右 |
| 6 | <、<=、>、>=(关系比较) |
a < b + 3(先算 b+3 再比较) |
左→右 |
| 7 | ==(等于)、!=(不等于) |
a == b * 2(先乘后判断相等) |
左→右 |
| 8 | &&(逻辑与 > 逻辑或) |
a > 0 && b < 5(先算关系运算,再逻辑与) |
左→右 |
| 9 | =(赋值)、+=、-= 等复合赋值 |
a = b + 3;(先算 b+3 再赋值) |
右→左 |
二、典型易错题对比
-
++/--与赋值- 前缀
++a:先自增,再参与运算(如b = ++a;→a先 +1,再赋值给b)。 - 后缀
a++:先参与运算,再自增(如b = a++;→a先赋值给b,再 +1 )。
- 前缀
-
逻辑运算 vs 位运算
&&(逻辑与):短路特性(左边为假,右边不执行 );&(位与):无短路,逐位运算。- 优先级:
&高于&&?不!逻辑运算符&&/||优先级低于关系运算,但高于赋值;位运算&/|优先级低于关系运算,高于赋值。
-
复合赋值的“陷阱”
a += b * c:等价于a = a + (b * c)(先算乘,再复合赋值 ),而非(a + b) * c。
三、速记口诀(简化版 )
“单算移关与,逻条赋逗低”
(单目→算术→移位→关系→逻辑与→逻辑或→条件→赋值→逗号 ,优先级递减 )
考试遇运算符嵌套,优先看括号,再按优先级拆分,结合性辅助确认方向(如赋值、单目是“右结合”,算术、逻辑是“左结合” ),就能快速解题啦~

答案:D
考察知识点:C++ 整数除法与取余运算的优先级及结果类型
12 % 3 + 12 / 5
→ 0 + 2 // 12%3=0,12/5=2
→ 2
常见误区:
- 混淆整数与浮点数除法:若其中一个操作数为浮点数(如 12.0 / 5),结果会是 2.4,但题目中未明确说明 N为浮点数,默认按整数处理。
- 错误计算优先级:误认为 % 优先级高于 /,但实际上二者同级,按从左到右计算(本题中顺序不影响结果)。
答案:D。
考察知识点:C++ 中printf格式化输出(格式控制符与普通字符的输出规则,%d用于输出整数,双引号内普通字符原样输出 )。
解析:printf中{N}*{N}={%d*%d}里,{N}*{N}={和}是普通字符原样输出,%d对应N(值为 10 ),所以输出{N}*{N}={10*10},选 D。
答案:D
考察知识点:C++ 整数除法与乘法的运算顺序及结果,整数除法会截断小数部分 。
解析:输入first = 100,second = 200,先算first / second,即100 / 200 = 0(整数除法截断小数),再乘以second,0 * 200 = 0,输出 0 ,选 D 。

答案:C
考察知识点:C++ 中逻辑表达式、取余运算,对“能被 2 整除且除以 7 余数为 2”条件的逻辑转换 。
解析:“能被 2 整除”等价于 i % 2 == 0 、!(i % 2) 、i % 2 != 1 ;“除以 7 余数为 2”是 i % 7 == 2 。C 选项中 !(i % 7) 是“除以 7 余数为 0”,不符合需求,不能实现,选 C 。
等价写法对比
| 表达式 | 含义 | 示例(i=4) |
示例(i=5) |
|---|---|---|---|
i % 2 == 0 |
余数等于0,即能被2整除 | 4 % 2 → 0 ✔️ true |
5 % 2 → 1 ❌ false |
!(i % 2) |
余数取反,即余数为0时为真 | !(0) → ✔️ true |
!(1) → ❌ false |
i % 2 != 1 |
余数不等于1,即余数为0 | 4 % 2 → 0 ✔️ true |
5 % 2 → 1 ❌ false |

答案:A
考察知识点:C++ 循环中整数的累加运算,以及对称区间整数求和的规律(从 -n 到 n-1 的和为 -n )。
解析:循环 i 从 -1000 到 999 ,可看作 -1000 到 999 的整数相加,其中 -999 和 999 、 -998 和 998 等对称数相加为 0 ,最后剩下 -1000 ,所以 tnt 最终为 -1000 ,选 A 。

答案:A
考察知识点:C++ 中 for 循环的执行流程、continue 语句的作用(跳过本次循环剩余语句,进入下一次循环判断 )。
解析:
- 循环条件是
i < 100,每次循环i += 5。 - 当
i为 96 时,满足i < 100,执行continue,然后i变为 101 。 - 此时判断
101 < 100不成立,循环结束,i的值是 101 。
答案:C
考察知识点:C++循环、条件判断(continue、break作用,以及取余运算逻辑 )
解析:ontinue 是一个控制流语句,用于立即跳过当前循环体的剩余部分i从5开始,每次+5遍历到95。i为偶数时continue跳过tnt +=1,奇数才执行。同时找i%3==0 && i%7==0(即i是21倍数),第一个这样的i是105(超出循环)?不,循环i<100,i最大95,实际循环中i依次是5、10、15…95 。其中奇数i有5、15、25、35、45、55、65、75、85、95 ,共10个,执行到这些i时tnt +=1,且循环内无break触发(因无i同时被3和7整除且小于100 ),所以tnt最终为10,选C 。
二、判断题(每题2分,共20分)
答案:正确(√)
考察知识点:高级编程语言的执行原理(高级语言需通过编译或解释转换为机器指令执行 )
解析:C++、Python作为高级语言,代码需经编译(C++)或解释(Python)转化为机器指令,由计算机硬件执行,所以该表述正确。

- 答案:错误(×)
- 考察知识点:C++ 算术运算符(
*、%)的运算规则,取余运算结果与操作数的关联性。 - 解析:
N * 2 % N结果取决于N。如N = 1时,1*2%1 = 0;N = 3时,3*2%3 = 0,并非恒为2,结果随N变化。

- 答案:错误(×)
- 考察知识点:C++ 数据类型(
char)的存储特性,cin输入规则及 ASCII 码运算。 - 解析:
char存字符 ASCII 码,输入10时,cin只读首个字符'1'(ASCII 是49),计算49 * 2 = 98,输出不是20,因类型与输入处理不匹配。
- 答案:正确(√)
- 考察知识点:C++
continue语句的作用,循环结构中流程控制的逻辑简化。 - 解析:
continue用于跳过循环剩余代码,但此代码中continue后无额外逻辑,删除后if-else正常执行奇偶判断,程序效果不变。
- 答案:错误(×)
- 考察知识点:C++ 标识符(变量名)的命名规则,合法标识符的定义。
- 解析:
_是 C++ 合法标识符(变量名),可用于循环变量,代码语法合规,能正常输出*,不会报错。
- 答案:正确(√)
- 考察知识点:
for循环的执行流程(初始化、条件判断、增量、循环体执行逻辑 )。 - 解析:
i初始为3,满足i < 5,输出3;i += 2后i = 5,不满足i < 5,循环结束。实际只输出3? 哦,错了!重新看:for (int i = 3; i < 5; i += 2),第一次i=3,输出3;然后i += 2变为5,5 < 5不成立,循环结束。所以只输出3,答案是错误(×) 。之前分析错误,核心是循环条件判断:i < 5,i=3执行后,i变为5,不满足条件,循环仅执行一次,输出3,并非3和5。
- 答案:错误(×)
- 考察知识点:
for循环遍历、表达式逻辑判断(i * 2 < i * i何时为真 ),以及布尔值输出(C++ 中bool转int输出特性 )。 - 解析:循环
i从0到9:i=0:0*2 < 0*0→0 < 0→false(输出0)i=1:2 < 1→false(输出0)i=2:4 < 4→false(输出0)i=3:6 < 9→true(输出1)i=4:8 < 16→true(输出1)i=5到9:均满足true。
实际输出0 0 0 1 1 1 1 1 1,true(即1)出现6次,不是7次,答案错误(×) 。
- 答案:错误(×)
- 考察知识点:C++ 变量命名规则(合法标识符的构成:字母、数字、下划线,且不能含
-等特殊字符 )。 - 解析:
user-Name含非法字符-,不是合法变量名,答案错误(×) 。
- 答案:错误(×)
- 考察知识点:
continue与break的区别(continue跳过本次循环剩余代码,break终止整个循环 )。 - 解析:
continue是跳过当前循环迭代剩余部分,进入下一次迭代;break才是提前结束循环。答案错误(×) 。
- 答案:错误(×)
- 考察知识点:
scanf输入规则(%d只读取整数部分,输入3.6时N接收3),以及整数除法与乘法的运算顺序。 - 解析:
scanf("%d", &N)输入3.6,N实际为3(%d截断小数);计算3 / 3 * 5 = 5,不是6。答案错误(×) 。
三、编程题(每题 25 分,共50 分)



#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,x,y;
cin>>n>>x>>y;
cout<<n-ceil(y*1.0/x);
return 0;
}



#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读取整数个数
for (int i = 0; i < n; i++) {
int num;
cin >> num; // 读取需要处理的整数
// 核心逻辑:四舍五入到最近整十数
int remainder = num % 10; // 取个位数字
if (remainder < 5) {
num -= remainder; // 小于5则舍去个位(如43 → 40)
} else {
num += (10 - remainder); // 大于等于5则进位到下一个整十(如58 → 60)
}
cout << num << endl; // 输出结果
}
return 0;
}
以下是用 C++ 实现“将整数四舍五入到最近整十数”的代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 读取整数个数
for (int i = 0; i < n; i++) {
int num;
cin >> num; // 读取需要处理的整数
// 核心逻辑:四舍五入到最近整十数
int remainder = num % 10; // 取个位数字
if (remainder < 5) {
num -= remainder; // 小于5则舍去个位(如43 → 40)
} else {
num += (10 - remainder); // 大于等于5则进位到下一个整十(如58 → 60)
}
cout << num << endl; // 输出结果
}
return 0;
}
四舍五入核心:
- 用
num % 10取个位数字remainder。 - 若
remainder < 5,直接减去个位(如43 → 43 - 3 = 40)。 - 若
remainder ≥ 5,加上10 - remainder进位(如58 → 58 + 2 = 60)。
输出:每个数处理完直接输出,符合题目“每行一个结果”的要求。
有问题/建议,欢迎指出~~~
更多推荐

所有评论(0)