GESP:2025年9月 C++三级 真题及解析

四季读书网 3 0
GESP:2025年9月 C++三级 真题及解析
老师已经为大家准备好电子打印版需要完整电子版文件的朋友,可以拉到文末查看
GESP:2025年9月 C++三级 真题及解析 第1张
GESP:2025年9月 C++三级 真题及解析 第2张
GESP:2025年9月 C++三级 真题及解析 第3张
GESP:2025年9月 C++三级 真题及解析 第4张
GESP:2025年9月 C++三级 真题及解析 第5张

【答案解析】

1.解释:答案选C。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第6张

相关知识点的复习与拓展:

截至考试当年9月,有关隐式类型转换的相关知识点,详见下图——

GESP:2025年9月 C++三级 真题及解析 第7张
GESP:2025年9月 C++三级 真题及解析 第8张
2.解释:答案选C。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第9张

相关知识点的复习与拓展:

截至考试当年9月,有关逻辑运算符的相关知识点,详见下图——

GESP:2025年9月 C++三级 真题及解析 第10张

3.解释:答案选D。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第11张

4.解释:答案选B。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第12张

5.解释:答案选B。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第13张

6.解释:答案选B。

详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第14张
7.解释:答案选B。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第15张
8.解释:答案选D。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第16张

相关知识点的复习与拓展:

截至考试当年9月,在循环内执行break 语句和continue语句的机制区别,详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第17张
9.解释:答案选A。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第18张
10.解释:答案选C。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第19张
GESP:2025年9月 C++三级 真题及解析 第20张
11.解释:答案选D。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第21张
GESP:2025年9月 C++三级 真题及解析 第22张
12.解释:答案选C。
详细解析见下图——
GESP:2025年9月 C++三级 真题及解析 第23张
13.解释:答案选D。
选项A‌的说法错误。C++ 支持多种参数传递方式,包括值传递、引用传递和指针传递。
选项B‌的说法错误。函数的形参在函数调用结束后会自动释放内存,不再占用空间。
选项C‌的说法错误。没有返回值的函数必须声明为 void 类型,但可以包含 return 语句(不带返回值)。
选项D‌的说法是正确的。C++(包括C++11及之后)要求函数必须显式声明返回类型,不再允许默认返回 int (C语言旧标准允许默认 int ,但C++始终禁止)。
14.解释:答案选C。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第24张

15.解释:答案选D。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第25张
GESP:2025年9月 C++三级 真题及解析 第26张
GESP:2025年9月 C++三级 真题及解析 第27张
GESP:2025年9月 C++三级 真题及解析 第28张

【答案解析】

1.解释:错误。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第29张

相关知识点的复习与拓展:

我们可以用下面的代码来测试上面的说法(以64位系统为例)——

#include <iostream>using namespace std;intmain() {    cout << "sizeof('a') = " << sizeof('a') << endl;  // C++ 输出: 1    cout << "sizeof(char) = " << sizeof(char) << endl; // 输出: 1    cout << "sizeof(int) = " << sizeof(int) << endl;   // 输出: 4    return 0;}

2.解释:正确。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第30张

相关知识点的复习与拓展:

截至考试当年9月,有关未被显式初始化的全局变量/局部变量,其默认值的对比,详见下图——

GESP:2025年9月 C++三级 真题及解析 第31张

3.解释:正确。

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第32张

相关知识点的复习与拓展:

截至考试当年9月,有关三种循环结构的执行逻辑比,详见下图——

GESP:2025年9月 C++三级 真题及解析 第33张

4.解释:正确。

详细解析如下——

GESP:2025年9月 C++三级 真题及解析 第34张
GESP:2025年9月 C++三级 真题及解析 第35张
GESP:2025年9月 C++三级 真题及解析 第36张

相关知识点的复习与拓展:

我们可以用函数模拟自增运算符的实现,更清晰看到返回值的区别——

#include<iostream>using namespace std;// 模拟前置自增 ++i:返回引用(左值)intpreIncrement(int& num){    num += 1;    return num; // 返回原变量的引用(左值)}// 模拟后置自增 i++:返回值(右值)intpostIncrement(int& num){    int temp = num; // 保存原值    num += 1;       // 变量自增    return temp;    // 返回临时值(右值)}intmain(){    int i = 5;    preIncrement(i) = 10// 等价于 ++i = 10,正常运行    // postIncrement(i) = 20; // 等价于 i++ = 20,编译报错    cout << i << endl; // 输出 10    return 0;}

5.解释:错误。

本题表述不够严谨、略有争议,具体解析如下——

该表述不完全准确,需要分C++标准版本讨论:

● 在C++03及更早标准中:枚举常量(如 RED )的类型是 int,表述成立。

● 在C++11及以后标准中:枚举常量的类型是枚举所属的底层类型(默认是int ,但可显式指定),且枚举本身成为独立的强类型,表述不严谨

针对本题总结如下:
1. 原生类型:RED 的类型是枚举类型 Color,不是 int
2. 隐式转换:普通枚举的常量可隐式转为 int (强类型枚举不行),这是易误解为"类型是 int"的根源;
2. 底层存储:枚举常量的底层存储类型默认是 int,但这是存储层面,而非语法层面的类型。

相关知识点的复习与拓展:

我们可以用代码来帮助理解,更清晰看到返回值的区别——

● C++ 允许枚举常量隐式转换为整数类型(比如 int ),但反过来,整数不能隐式转换为枚举类型。这是关键区别,看代码示例更直观:

GESP:2025年9月 C++三级 真题及解析 第37张

● 为了避免隐式转换带来的问题,C++11 引入了强类型枚举(enum class),此时枚举常量完全不会隐式转 int ,进一步证明其原生类型不是 int 。

GESP:2025年9月 C++三级 真题及解析 第38张

6.解释:错误

详细解析见下图——

该表述是错误的。这个宏定义存在严重的逻辑缺陷,SQUARE(2+3) 的计算结果并非预期的25,而是会得到11,完全不符合设计意图。

一、错误根源分析如下:

1. 宏的文本替换特性

C/C++的宏是纯文本替换,而非函数调用。当执行 SQUARE(2+3) 时,预处理器会直接将宏展开为:

2+3*2+3

由于乘法运算符*的优先级高于加法+,实际计算顺序用算术表达式比到达为:(2) + (3*2) + 3 = 2 + 6 + 3 = 11

2. 其他潜在风险

该宏还存在以下安全问题:

● 重复求值:如果传入的是表达式(例如SQUARE(i++) ),会导致变量被多次修改,引发未定义行为
● 运算符优先级问题:任何带有低优先级运算符的参数都会破坏计算逻辑

二、安全修复方案

方案1:完善宏定义(不推荐,仅作修复演示)

通过添加括号保证运算顺序和求值单次性:

// 正确的宏定义:为参数和整体结果都添加括号#define SQUARE(x) ((x) * (x))

验证SQUARE(2+3) 会被展开为((2+3)*(2+3)),计算结果为25,符合预期。

方案2:使用 constexpr 函数(C++11及以上,推荐)

用编译期常量函数替代宏,完全避免宏的所有缺陷:

#include<iostream>using namespace std;// 编译期计算的平方函数,类型安全且无宏的缺陷constexprintsquare(int x){    return x * x;}intmain(){    cout << square(2+3) << endl; // 输出25    int i = 3;    cout << square(++i) << endl; // 输出16,i仅自增1次,行为可预测    return 0;}

安全警告在现代C++开发中,除非有特殊的历史兼容需求,否则应优先使用 constexpr 函数、模板或内联函数替代宏定义,从根源避免宏的各种陷阱。

7.解释:错误

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第39张
#include<climits>cout << "Bits in char: " << CHAR_BIT << endl; // 通常输出 8,但可能为其他值

8.解释:错误

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第40张

相关知识点的复习与拓展:

截至考试当年9月,有关C/C++语言的运算符的优先级顺序,详见下图——

GESP:2025年9月 C++三级 真题及解析 第41张

9.解释:错误

详细解析见下图——

GESP:2025年9月 C++三级 真题及解析 第42张
10.解释:错误

在同一个作用域内,extern 声明的变量(即声明而非定义)可以多次出现,但不能多次定义。如果 extern 声明带有初始化器(例如, extern int a = 10;  ),则它被视为定义,此时在同一作用域内重复定义会导致编译错误。

GESP:2025年9月 C++三级 真题及解析 第43张
GESP:2025年9月 C++三级 真题及解析 第44张

GESP 2025年9月 C++三级 数组清零

#include<iostream>#include<vector>#include<climits>using namespace std;intmain(){    int n;    cin >> n;    vector<inta(n);    for (int i = 0; i < n; ++i) {        cin >> a[i];    }    int ans = 0;    while (true) {        // 检查数组是否全为 0        bool all_zero = true;        for (int num : a) {            if (num != 0) {                all_zero = false;                break;            }        }        if (all_zero) break;        // 步骤1:找到最大值(多个最大值取下标最大的)        int max_val = -1;        int k = -1;        for (int i = 0; i < n; ++i) {            if (a[i] > max_val) {                max_val = a[i];                k = i;            }             else if (a[i] == max_val) {                k = i; // 更新为更大的下标            }        }        // 步骤2:找到非零元素中的最小值        int min_non_zero = INT_MAX;        for (int num : a) {            if (num != 0 && num < min_non_zero) {                min_non_zero = num;            }        }        // 步骤3:更新数组        a[k] -= min_non_zero;        ans++;    }    cout << ans << endl;    return 0;}
代码思路——
GESP:2025年9月 C++三级 真题及解析 第45张
GESP:2025年9月 C++三级 真题及解析 第46张
GESP:2025年9月 C++三级 真题及解析 第47张
GESP:2025年9月 C++三级 真题及解析 第48张

GESP 2025年9月 C++三级 日历制作

#include<iostream>#include<iomanip>#include<vector>using namespace std;intmain(){    int m;    cin >> m;    //枚举2025年每个月的天数,2025年是平年,不需要考虑闰年29天的情况    vector<int> months = {312831303130313130313031};    // 计算从1月到目标月份前一个月的总天数    int total_days = 0;    for (int i = 0; i < m - 1; i++) {        total_days += months[i];    }    // 计算目标月份第一天的星期(0-星期一,6-星期日)    int first_day = (2 + total_days) % 7// 2025年1月1日是星期三,对应2    int days = months[m - 1];    // 输出星期标题    cout << "MON TUE WED THU FRI SAT SUN" << endl;    // 输出日历    vector<string> week;    // 添加空白格直到第一天    for (int i = 0; i < first_day; i++) {        week.push_back("   ");    }    // 添加日期    for (int day = 1; day <= days; day++) {        // 格式化为3字符宽度,右对齐        string s = to_string(day);        while (s.length() < 3) {            s = " " + s;        }        week.push_back(s);        // 每满7个日期输出一行        if (week.size() == 7) {            for (int i = 0; i < 7; i++) {                cout << week[i];                if (i < 6) cout << " ";            }            cout << endl;            week.clear();        }    }    // 输出最后一行    if (!week.empty()) {        for (int i = 0; i < week.size(); i++) {            cout << week[i];            if (i < week.size() - 1) cout << " ";        }        cout << endl;    }    return 0;}

相关知识点的复习与拓展:

我们将本题略作修改为——

输入格式:一行,包含两个正整数(大于等于1) n,m,表示需要按照格式输出 n 年 m 月的日历。

#include<iostream>#include<iomanip>#include<vector>using namespace std;// 判断闰年boolisLeap(int year){    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);}intmain(){    int year, month;    cin >> year >> month;    // 月份天数,2月根据闰年调整    vector<int> months = {312831303130313130313031};    if (isLeap(year)) {        months[1] = 29;    }    // 计算该年1月1日是星期几(0=星期一,6=星期日)    // 从公元1年到year-1年的总天数(格里历,假设公元1年1月1日是星期一)    int daysBeforeYear = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400;    int firstDayOfYear = daysBeforeYear % 7// 0=星期一    // 计算目标月份之前的总天数(1月到month-1月)    int daysBeforeMonth = 0;    for (int i = 0; i < month - 1; ++i) {        daysBeforeMonth += months[i];    }    // 目标月份第一天的星期    int firstDay = (firstDayOfYear + daysBeforeMonth) % 7;    int daysInMonth = months[month - 1];    // 输出星期标题    cout << "MON TUE WED THU FRI SAT SUN" << endl;    // 输出第一行前面的空白格(每个空白占3字符宽度,右对齐)    for (int i = 0; i < firstDay; ++i) {        cout << setw(3) << " ";  //用setw()格式化,替代手动补空格,更简洁        if (i < 6) cout << " ";  // 除最后一个外,每列后加一个空格    }    // 输出日期    for (int day = 1; day <= daysInMonth; ++day) {        cout << setw(3) << day;        if ( (firstDay + day) % 7 != 0 && day != daysInMonth) {            cout << " ";  // 不是一周的最后一天且不是最后一天,加空格        }        // 如果是一周的结束(星期六)或最后一天,换行        if ( (firstDay + day) % 7 == 0 || day == daysInMonth) {            cout << endl;            // 如果不是最后一天,新的一行开始不需要前置空格(因为下一行紧接着输出)        }    }    return 0;}
GESP:2025年9月 C++三级 真题及解析 第49张

课程体系——

GESP:2025年9月 C++三级 真题及解析 第50张
需要无水印PDF格式文件,
或者课程体系咨询,
欢迎扫描下面二维码添加好友垂询。
GESP:2025年9月 C++三级 真题及解析 第51张

GESP:2025年9月 C++三级 真题及解析 第52张

▍ 声明:本文整理自网络,如有侵权,请联系删除。

本公号刊载此文,是出于合法合理地分享和传播信息,扩大大受众范围,促进学术交流,推动共同进步之目的。公众号持有人郑重声明,本文的发布,将严格遵守相关规定和法律法规,不侵犯任意潜在作者的权益,不改变引用原文(若有)的意图和内容。若有来源标注错误或侵犯了您的合法权益,请随时与我们联系协商,联系(QQ):993225721,我们将及时更正、删除。文章若有幸得到转载,首先,公众号持有人感谢转载人为读者阅读提供了有价值的信息和知识,希望文章能够在被转载的平台上得到更广泛的传播和交流;其次,转载人应充分考虑到转载动作本身所可能带来的相应的风险和责任,包括但不限于侵犯知识产权、侵犯他人权益等行为所引起的法律责任,确保本文的合法传播和使用。同时,本人也极其愿意在转载过程中尽力配合转载人了解、关注、规避、消除相关的潜在风险。若转载人有相任何关疑虑,同样欢迎随时与我们联系协商,联系(QQ):993225721。

喜欢您关注我们哦——

抱歉,评论功能暂时关闭!