「C++」1~4级,你能通过几级?

这个季度的GESP等级考试已经结束,下次要到6月份才能参加了,没有参加的同学,你觉得自己的水平到几级了呢?不妨做个测试。

大家好,我是大李!

GESP 2026年3月的认证已经结束。

大李翻阅了 1~4 级的真题,从每一级中挑选了2个代表性且有趣的题目分享给大家。看看以你现在的水平,能闯到第几关?

每级测试结束都有解析,别忘了查看哦!

一级

一级主要考察对计算机系统的初步认知以及 C++ 的基础语法。

T1、硬件与输入输出

原题: 2026年春节联欢晚会上一个武术表演节目《武BOT》。节目中多个人形机器人会表演空翻,它们落地可能会有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备( )。

A. 检测重心的重力传感器
B. 预装的 AI 算法程序
C. 接收动作指令的遥控器
D. 拍摄其他机器人的摄像头

T2、变量命名规则

原题: 如果将下面 C++ 代码中的所有 PI 改写为 Pai,有关说法正确的是( )。

double PI = 3.1415926;
cout << (PI);

A. 程序将报错,因为 Pai 不是 C++ 关键词。
B. 程序将报错,因为 Pai 未定义。
C. 程序将报错,因为 PI 是常量,不能改名。
D. 程序能正常编译执行,且输出结果不变。

T1 解析B。输入设备负责采集外部信息。传感器、遥控接收器和摄像头都是采集数据的硬件;而“AI 算法程序”属于软件/处理系统,不属于硬件输入设备。

T2解析D。C++ 的变量名只要符合命名规则(字母、数字、下划线组成,数字不开头),叫什么都可以。PI 改成 Pai 只是换个名字,不影响功能。

二级:

二级考察的难点在于逻辑表达式的等效转化以及浮点数的存储特性。

T1:浮点数精度陷阱

原题: 执行下面代码后,输出结果是( )。

cout << ((0.1 + 0.2) == 0.3);

A. 1
B. 0
C. 0.3
D. 编译错误

T2:逻辑转换(德·摩根定律)

原题: 逻辑表达式 !(x > 5 && y <= 10) 对应的等价表达式是( )。

A. x <= 5 && y > 10
B. x > 5 || y <= 10
C. x <= 5 || y > 10
D. x < 5 || y >= 10

T1解析B。在计算机内部,0.1 和 0.2 无法用二进制精确表示。0.1 + 0.2 的实际计算结果是 0.30000000000000004,并不严格等于 0.3。所以输出为 0(假)。

T2解析C。根据德·摩根定律(涨知识):!(A && B) 等价于 !A || !B。对 x > 5 取反得 x <= 5,对 && 取反得 ||,对 y <= 10 取反得 y > 10

三级

三级重点在于字符处理(ASCII码)、进制转换和位运算。

T1:字符与整型的转化

原题: 如果字符变量的值是字符 '1',那么 (int)'1' 的值是?( )

A. 1
B. -1
C. 49
D. +1 或者 -1

T2:位运算技巧

原题: ab 是整型变量,各自有互不相同的初始值。下列程序实现了什么效果( )。

a = a ^ b;
b = a ^ b;
a = a ^ b;

A. a, b 的值从始至终都没有改变。
B. a, b 的值实现了互换。
C. a, b 的值互换了以后,又还回去了。
D. a, b 的值没有意义。

T1解析C。字符在内存中存储的是其 ASCII 码值。字符 '0' 的码值是 48,字符 '1' 就是 49。

T2解析B。这是著名的利用“异或运算”交换两个变量值的技巧,不需要额外的临时变量即可完成互换。

四级

四级引入了指针、作用域、结构体和基础排序算法,是业余与专业的“分水岭”。

T1:多级指针运算

原题: 执行下面代码后,输出为( )。

int a = 5;
int* p = &a;
int** q = &p;
**q += 7;
cout << a << " " << *p;

A. 5 5
B. 12 12
C. 12 5
D. 5 12

T2:变量作用域

原题: 执行下面代码后,输出为( )。

int x = 3;
void f() {
    int x = 10;
    x += 2;
    cout << x << " " << ::x << " ";
}
int main() {
    f();
    return 0;
}

A. 12 3
B. 12 12
C. 5 3
D. 3 12

T1解析Bp 指向 aq 指向 p。因此 **q 直接指向变量 a**q += 7 使 a 变为 12。由于 p 也指向 a*p 自然也是 12。

T2解析A。函数内的 int x = 10 是局部变量,屏蔽了全局变量。x += 2 修改的是局部变量(变 12)。而 ::x 是作用域解析符,指向全局变量 x(依然是 3)。