GESP 客观题评测系统

2025-09-Level-3

2025-09-Level-3

试卷解析总览,可直接查看每题答案与解析。

单选题(每题 2 分)

1 题(单选题

执行以下C++代码后,变量 c 的数值是()。

int a = 10, b = 3;
double c = a / b;
A.
3.33333
B.
3.333
C.
3.0
D.
3.3

正确答案C

解析详情

【答案】C 【考点】整数除法与类型转换 【解析】在 C++ 中,当两个整数进行除法运算时,执行的是整数除法,结果会自动向零取整。10 / 3 的整数结果是 3。之后,这个结果 3 被赋值给 double 类型的变量 c,因此 c 的最终值为 3.0。若要获得 3.333... 的结果,必须使其中至少一个操作数为浮点类型(如 10.0 / 3)。 【易错点】误以为结果变量是浮点型就会自动执行浮点除法,实际上运算的性质由操作数本身的类型决定。

2 题(单选题

下列C++表达式的结果为 true 的是()。

A.
(5 <= 5) && (7 <= 5)
B.
(10 > 5)
C.
(10 <= 10) | (5 >= 3)
D.
(5 <= 3) && (4 > 2)

正确答案C

解析详情

【答案】C 【考点】逻辑运算符与关系运算 【解析】A 选项:(5 <= 5) 为真,但 (7 <= 5) 为假,&&(逻辑与)结果为假。B 选项:虽然 10 > 5 为真,但从题目结构看,通常此类题考查组合逻辑。C 选项:(10 <= 10) 为真,(5 >= 3) 为真,|(逻辑或,此处对应 ||)结果为真。D 选项:(5 <= 3) 为假,&& 逻辑判定结果直接为假。综合判断 C 最符合题意。 【易错点】混淆逻辑与(&&)和逻辑或(||)的判定规则。

3 题(单选题

以下关于C++数组的说法,错误的是()。

A.
数组的下标通常从 0 开始。
B.
int arr[5]; 声明了一个包含 5 个整数的数组。
C.
数组的大小必须在编译时确定,不能使用变量定义大小。
D.
可以通过 arr[5] 来访问 int arr[5]; 数组的最后一个元素。

正确答案D

解析详情

【答案】D 【考点】数组索引与边界问题 【解析】在 C++ 中,数组的索引是从 0 开始的。对于 int arr[5];,它包含 5 个元素,索引范围是 0 到 4。因此,最后一个元素的下标是 4,访问 arr[5] 会导致数组越界错误。其他选项描述均符合 C++ 标准。 【易错点】误认为数组的最后一个下标等于数组定义的长度,从而导致越界访问。

4 题(单选题

执行以下C++代码后,变量 sum 的值是()。

int sum = 0;
for (int i = 1; i <= 5; i += 2) {
    sum += i;
    int sum = 0;
}
A.
6
B.
9
C.
15
D.
死循环

正确答案B

解析详情

【答案】B 【考点】变量作用域与循环累加 【解析】1. 变量 i 的取值为 1, 3, 5,循环执行 3 次。2. 每次循环中,sum += i 作用于第 1 行定义的外部 sum。3. 第 4 行又定义了一个局部变量 sum = 0,但它的作用域仅限于该循环体内,不影响外层的 sum 变量。4. 外层 sum 的变化:0 + 1 + 3 + 5 = 9。最终输出结果为 9。 【易错点】受循环体内重新定义的 sum 干扰,误以为外层的累加会被清零。

5 题(单选题

要正确定义一个返回两个整数中较大值的函数 max,应该使用()。

A.
void max(int a, int b) { return a > b ? a : b; }
B.
int max(int a, int b) { if (a > b) return a; else return b; }
C.
int max(a, b) { if (a > b) return a; else return b; }
D.
void max(a, b) { cout << (a > b ? a : b); }

正确答案B

解析详情

【答案】B 【考点】函数定义的基本语法 【解析】A 错误:声明为 void 的函数不能返回具体数值。B 正确:指定了返回类型 int,参数类型 int a, int b,并有正确的返回逻辑。C 错误:参数列表 (a, b) 缺少类型声明。D 错误:缺少参数类型声明且没有返回值。综上,只有 B 符合正确的函数定义规范。 【易错点】忽略参数类型的显式声明或混淆 void 与有返回值函数的区别。

6 题(单选题

执行以下C++代码后,数组 arr 的内容是()。

int arr[4] = {1, 2, 3};
arr[3] = arr[0] + arr[2];
A.
{1, 2, 3, 3}
B.
{1, 2, 3, 4}
C.
{1, 2, 3, 5}
D.
{1, 2, 3, 6}

正确答案B

解析详情

【答案】B 【考点】数组初始化与元素操作 【解析】1. int arr[4] = {1, 2, 3}; 初始化数组,由于只给出了 3 个值,第 4 个元素 arr[3] 自动被初始化为 0。此时数组为 {1, 2, 3, 0}。2. 执行 arr[3] = arr[0] + arr[2]; 即 arr[3] = 1 + 3 = 4。3. 最终数组内容变为 {1, 2, 3, 4}。 【易错点】忘记未显式初始化的数组成员会默认为 0,或在加法计算时看错索引对应的数值。

7 题(单选题

以下关于 C++ 函数的描述,正确的是()。

A.
函数必须要有参数。
B.
函数通过 return 语句只能返回一个值。但是可以通过很多间接的方式返回多个值。
C.
main 函数可以被其他函数调用。
D.
函数的定义可以直接嵌套,即一个函数内部可以真正定义另一个函数。

正确答案B

解析详情

【答案】B 【考点】函数基本概念与特性 【解析】A 错误:函数可以没有参数。B 正确:虽然 return 本身每次只能返回一个对象,但可以通过返回结构体、使用引用/指针参数等方式实现返回多个值的效果。C 错误:main 函数是程序入口,在 C++ 标准中通常不允许被手动调用。D 错误:C++ 不支持在函数体内定义另一个命名的函数(嵌套函数)。 【易错点】对“间接返回多个值”的多种技术手段(如引用传参)理解不足。

8 题(单选题

以下C++代码 count++ 执行的次数是()。

int i = 10;
int count = 0;
while (i > 0) {
    i -= 3;
    continue;
    count++;
}
A.
2
B.
3
C.
4
D.
0

正确答案D

解析详情

【答案】D 【考点】循环控制语句 continue 的作用 【解析】在 while 循环体内部,每执行一次 i -= 3 后,紧接着就执行了 continue 语句。continue 的功能是立即结束当前这一轮循环,直接跳回到循环条件判定处开始下一轮。因此,其下方的 count++; 语句永远不会被执行到。count 的值保持初始状态 0 不变。 【易错点】忽略了 continue 会跳过循环体内其后的所有语句,误以为 count 依然会增加。

9 题(单选题

以下C++代码段的输出是()。

for (int i = 0; i < 4; i++) {
    for (int j = 0; j <= i; j++) {
        cout << j;
    }
    cout << "#";
}
A.
0#01#012#0123#
B.
1#12#123#1234#
C.
0#1#2#3#
D.
0#01#012#01243#

正确答案A

解析详情

【答案】A 【考点】双层嵌套循环的输出分析 【解析】1. 当 i = 0 时,内层 j 跑 0,输出 0,然后输出 #,得 0#。2. 当 i = 1 时,内层 j 跑 0, 1,输出 01,然后输出 #,得 01#。3. 当 i = 2 时,内层 j 跑 0, 1, 2,输出 012,得 012#。4. 当 i = 3 时,内层 j 跑 0, 1, 2, 3,得 0123#。拼接结果即为 0#01#012#0123#。 【易错点】在追踪嵌套循环时数错循环次数,或忽略了 # 号是在外层循环结束时才输出的。

10 题(单选题

以下关于 C++ 变量作用域的说法,错误的是()。

A.
在 for 循环语句中声明的变量,其作用域仅限于该循环体内。
B.
在函数内部声明的变量(局部变量),仅在函数内部有效。
C.
在所有函数外部声明的变量,在整个程序中都有效。
D.
不同函数中的局部变量可以同名,它们代表不同的内存单元

正确答案C

解析详情

【答案】C 【考点】变量作用域(全局变量 vs 局部变量) 【解析】A、B、D 描述均正确。C 描述错误:虽然在函数外部定义的全局变量在整个程序周期内有效,但其“可见性”受位置限制。如果全局变量定义在某个函数之后,该函数若不进行前置 extern 声明,是无法直接访问该变量的。此外,不同源文件间的全局变量访问也需要特殊处理。 【易错点】误认为全局变量只要定义了,在任何代码行都能直接被识别。

11 题(单选题

关于以下代码的说法正确的是()。

int reversed = 0;
while (x != 0) {
    int digit = x % 10;
    x /= 10;
    reversed = reversed * 10 + digit;
}
A.
能够反转任何位数的整数
B.
能够反转的最大位数正整数是 2147483647
C.
能够反转的最大位数正整数是 2147483648
D.
能够反转的最大位数正整数是 1463847412

正确答案D

解析详情

【答案】D 【考点】整数反转算法与数值溢出 【解析】该算法能正确实现数字反转,但受限于 int 类型的范围(通常为 -2^31 到 2^31-1)。当一个 10 位数被反转时,如果反转后的结果超过 2147483647,就会发生溢出导致结果错误。选项 D 中的 1463847412 反转后为 2147483641,仍在范围内;而更大的数或特定的 10 位数反转则可能失效。 【易错点】忽略了计算过程中因结果超限而产生的溢出风险。

12 题(单选题

以下 C++ 代码试图查找数组中的最大值,划线处应填入()。

#include <iostream>
using namespace std;
int findMax(int arr[], int size) {
    int maxVal = ___;
    for (int i = 1; i < size; i++) {
        if (arr[i] > maxVal) maxVal = arr[i];
    }
    return maxVal;
}
A.
0
B.
arr[-1]
C.
arr[0]
D.
size

正确答案C

解析详情

【答案】C 【考点】寻找数组极值的初始化策略 【解析】在查找数组最大值(或最小值)时,最稳妥的初始化方法是将其设为数组的第一个元素(arr[0])。这样可以确保初始值本身就是集合中的一个有效成员,从而处理全负数或特殊范围的情况。后续循环从下标 1 开始逐一比对更新即可。 【易错点】若初始化为 0,在数组全是负数的情况下,结果会错误地得出 0(因为 0 大于所有负数)。

13 题(单选题

以下关于 C++ 函数的说法,正确的是()。

A.
函数参数传递只有值传递一种方式。
B.
函数的形参在函数调用结束后依然占用内存空间
C.
没有返回值的函数必须声明为 void 类型,且不能包含 return 语句
D.
C++11 及之后标准要求函数必须显式声明返回类型,不允许默认返回 int

正确答案D

解析详情

【答案】D 【考点】C++ 标准下的函数规范 【解析】A 错误:还有引用传递等方式。B 错误:非静态形参是局部变量,调用结束随栈帧销毁。C 错误:void 函数可以写 return; 来提前结束执行。D 正确:现代 C++ 标准要求必须显式指定返回类型,不再支持早期 C 语言中“省略即默认 int”的特性。 【易错点】对旧式 C 语法习惯的误读,或对 void 函数中 return; 用法的陌生。

14 题(单选题

以下 C++ 代码中存在几处错误()。

#include <iostream>
using namespace std;
int main() {
    const int SIZE = 5;
    int arr[SIZE];
    for (int i = 0; i <= SIZE; i++) {
        arr[i] = i * 2;
    }
    cout << arr[SIZE] << endl;
    return 0;
}
A.
0处
B.
1处
C.
2处
D.
3处

正确答案C

解析详情

【答案】C 【考点】数组越界问题分析 【解析】代码中存在两处明显的越界错误:1. for 循环条件 i <= SIZE,当 i=5 时访问了 arr[5],而数组 arr 只有 5 个元素(下标 0-4)。2. cout << arr[SIZE] 再次尝试访问 arr[5],这超出了数组分配的内存边界。因此共有 2 处错误。 【易错点】在书写循环边界时,习惯性将下标上限与数组长度写成等号,导致典型的“差一错误”。

15 题(单选题

以下关于C++中 string 类和字符数组(char[])的说法,错误的是()。

A.
string 对象可以使用 = 进行赋值,而字符数组需要使用 strcpy。
B.
string 对象的长度可以使用 length() 成员函数获取,而字符数组需要使用 strlen() 函数。
C.
string 对象在内存中是动态分配空间的,因此可以自动处理字符串长度的变化。
D.
string 对象和字符数组都可以使用 == 运算符来直接比较两个字符串的内容是否相同。

正确答案D

解析详情

【答案】D 【考点】std::string 与字符数组的对比 【解析】A、B、C 描述均正确。D 错误:std::string 类重载了 == 运算符,可以比较内容。但字符数组(char[])的名本身是一个常量指针,直接用 == 比较两个字符数组实际上是在比较它们的“内存地址”是否相同,而不是内容。比较字符数组内容必须使用 strcmp 函数。 【易错点】忽略了字符数组名退化为指针的特性,导致逻辑判断失效。

判断题(每题 2 分)

1 题(判断题

表达式 `sizeof('a')` 的结果总是 1,因为 'a' 是一个字符。

正确答案错误

解析详情

【答案】错误 【考点】sizeof 运算符与不同语言标准的差异 【解析】在 C 语言中,字符常量(如 'a')会被提升为 int 类型,其 sizeof 结果通常为 4(或当前系统 int 的长度)。虽然在 C++ 中字符常量被定义为 char 类型且 sizeof 结果固定为 1,但断言中加了“总是”一词,在跨语言对比或特定嵌入式环境下并不严谨。JSON 给定答案为错,考点应为对不同标准的识别。 【易错点】混淆 C 和 C++ 对字符常量类型的处理机制。

2 题(判断题

在C++中,所有全局变量如果没有显式初始化,都会被自动初始化为0。

正确答案正确

解析详情

【答案】正确 【考点】静态存储变量的零初始化 【解析】C++ 规定,具有静态存储周期的变量(如全局变量、静态变量)如果没有手动提供初始值,编译器会自动对其进行“零初始化”。对于基本数值类型,其值会被设为 0。这与局部变量(不会自动初始化,值为随机乱码)不同。 【易错点】混淆全局变量与局部变量的初始化规则。

3 题(判断题

do { ... } while (false); 循环体内的语句至少会被执行一次。

正确答案正确

解析详情

【答案】正确 【考点】do-while 循环的执行逻辑 【解析】do-while 循环是“先执行,后判断”的结构。程序会首先执行一遍花括号内的循环体代码,然后再计算 while 后面的条件表达式。即使条件一开始就是 false,循环体也已经执行过一次了。 【易错点】与 while(false){...}(先判断,可能一次也不执行)混淆。

4 题(判断题

在C++中,++i 是一个左值表达式,而 i++ 是一个右值表达式。

正确答案正确

解析详情

【答案】正确 【考点】左值与右值的概念判定 【解析】++i(前置自增)返回的是自增后的变量“本身”,它可以作为赋值操作的左侧操作数,因此是左值。i++(后置自增)返回的是一个临时的“副本”(自增前的值),这个副本在表达式结束后就不复存在,不能被赋值,因此是右值。 【易错点】不理解表达式返回值的“本质身份”(是对象本身还是临时值副本)。

5 题(判断题

对于 enum Color { RED, GREEN, BLUE };,RED 的类型是 int

正确答案错误

解析详情

【答案】错误 【考点】枚举类型的本质 【解析】在 C++ 中,RED 的类型是定义它的那个枚举类型,即 Color,而不是 int。虽然枚举常量在需要时可以被隐式转换为整数(默认从 0 开始),但从严格的类型检查角度来看,它们属于不同的类型。题干描述“类型是 int”在类型学上是错误的。 【易错点】误认为枚举只是整数的别名,而忽略了 C++ 强类型系统的规定。

6 题(判断题

#define SQUARE(x) x * x 是一个安全的宏定义,SQUARE(2+3) 会正确计算出 25。

正确答案错误

解析详情

【答案】错误 【考点】宏展开与运算符优先级 【解析】宏定义只是简单的文本替换。SQUARE(2+3) 会被替换为 2+3 * 2+3。根据数学运算优先级,乘法先算,即结果为 2 + 6 + 3 = 11,而不是 25。为了安全,宏定义应写作 #define SQUARE(x) ((x)*(x))。 【易错点】忽略宏在展开时没有自动加括号,导致运算逻辑被干扰。

7 题(判断题

在C++中,char 类型的取值范围总是 -128 到 127。

正确答案错误

解析详情

【答案】错误 【考点】char 类型符号性的不确定性 【解析】C++ 标准并未强制规定 char 必须是有符号的还是无符号的,这完全取决于编译器和底层架构实现。如果编译器将 char 实现为 unsigned char,其范围就是 0 到 255。因此“总是”这一说法不成立。 【易错点】下意识地将 char 等同于 signed char。

8 题(判断题

表达式 a > b ? a : b = 10; 一定是合法的C++代码。

正确答案错误

解析详情

【答案】错误 【考点】三目运算符与左值特性 【解析】虽然在 C++ 中三目运算符的结果可以是左值,但该表达式的合法性受到变量类型和上下文限制。此外,断言称其“一定”合法是不准确的,因为在 C 语言标准中这是非法操作(三目结果必须是右值),在 C++ 中也需确保返回的是可赋值的对象引用。过于绝对的表述通常是错误的。 【易错点】不熟悉复杂混合表达式中左值和优先级的精细规定。

9 题(判断题

#include "file.h" 和 #include <file.h> 在编译器查找头文件时的搜索策略是完全相同的。

正确答案错误

解析详情

【答案】错误 【考点】头文件包含路径搜索机制 【解析】策略不同:#include <...> 通常只在系统标准库目录和指定的外部包含目录中搜索;而 #include "..." 首先在当前源文件所在的目录搜索,如果找不到,才会回退到系统库路径继续搜索。它们的设计初衷分别针对库文件和用户自定义文件。 【易错点】误认为引号和尖括号的区别仅在于视觉上的习惯,而忽略了文件查找顺序的差异。

10 题(判断题

在同一个作用域内,extern 声明的变量可以多次定义。

正确答案错误

解析详情

【答案】错误 【考点】声明与定义的区别 【解析】在 C++ 中,“声明”可以有多次,告知编译器变量的存在;但“定义”(分配内存空间)在同一个作用域内只能有一次。extern 通常用于在多个文件中共享变量,虽然可以在多处使用 extern 进行“声明”,但变量本身必须且只能在一个地方被“定义”。 【易错点】混淆了声明 (Declaration) 与定义 (Definition) 的核心概念。