GESP 客观题评测系统

试卷解析 · 理解每一步

2026-03-Level-3

2026-03-Level-3

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

单选题

第 1 题(单选题,2 分)

如果字符变量 _1 的值是字符 1,那么 (int) _1 的值是? ()。

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

正确答案C

解析详情
答案 CASCII 编码
思路与推导
  1. 在 C++ 中,字符变量是以 ASCII 码形式存储的。字符 '1' 的 ASCII 码值是 49。当进行 (int) 强制类型转换时,取出的就是其对应的 ASCII 码数值。

第 2 题(单选题,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

解析详情
答案 B异或运算的应用
思路与推导
  1. 利用异或运算的性质(a^a=0, a^0=a)可以实现不使用临时变量交换两个数。第一步 a=a^b;第二步 b=a^b=(a^b)^b=a;第三步 a=a^b=(a^b)^a=b。最终 a, b 的值互换。

第 3 题(单选题,2 分)

关于下列正确的程序段,说法正确的是()。

char str1[] = "Hello";
char str2[] = {'H', 'e', 'l', 'l', '0'};
A.
字符数组 str1 和 str2 完全相同。
B.
cout << str1 << endl;
cout << str2 << endl;
这段程序将输出不同的结果。
C.
字符数组 str1 和 str2 不相等。
D.
这两个赋值方式完全相同。

正确答案C

解析详情
答案 CC 风格字符串与字符数组
思路与推导
  1. str1 使用字符串字面量初始化,包含末尾的空字符 '\0',数组长度为 6;str2 显式列出字符初始化,且最后一个字符是 '0'(数字零)而非 'o'(小写字母 o),且没有空字符,长度为 5。两者在长度和内容上均不相等。

第 4 题(单选题,2 分)

关于以下程序段,说法正确的是()。

int x=10;
cout<<(x++) + (++x)<<endl;
A.
C++11 标准中,这是未定义行为,不同的环境有可能出现不同的结果
B.
22
C.
21
D.
20

正确答案B

解析详情
答案 B自增运算符与表达式求值
思路与推导
  1. 在多数现代 C++ 编译器中,按照从左向右求值:x++ 返回 10,然后 x 变为 11;接着 ++x 将 x 从 11 变为 12 并返回 12。结果为 10 + 12 = 22。尽管在 C++17 之前这是未定义行为,但在该考题语境下通常按此类逻辑计算。

第 5 题(单选题,2 分)

8 位二进制下,十进制数 -15 的补码是()。

A.
11110000
B.
10001111
C.
10010000
D.
11110001

正确答案D

解析详情
答案 D补码表示法
思路与推导
  1. 正数 15 的原码为 00001111。负数 -15 的补码计算方法是:先取反得 11110000,再加 1,得 11110001。即符号位保持 1,数值位按位取反加一。

第 6 题(单选题,2 分)

三进制数 2102 (3) _{(3)} 转换成十进制是:()。

A.
63
B.
65
C.
67
D.
69

正确答案B

解析详情
答案 B进制转换
思路与推导
  1. 按权展开计算:2*3^3 + 1*3^2 + 0*3^1 + 2*3^0 = 2*27 + 1*9 + 0 + 2 = 54 + 9 + 2 = 65。因此三进制数 2102 对应的十进制数是 65。

第 7 题(单选题,2 分)

二进制数 10110101 是某数的 8 位补码,该数的十进制是()。

A.
-73
B.
-75
C.
-77
D.
75

正确答案B

解析详情
答案 B补码求原码
思路与推导
  1. 补码最高位为 1,表示负数。求原码:补码减 1 得 10110100,取反(符号位除外)得 11001011。数值位 1001011 转换成十进制为 64+8+2+1=75,故结果为 -75。

第 8 题(单选题,2 分)

已知 unsigned char c = 0x0F; (十六进制 0F = 二进制 00001111),执行 c = c << 3; 后,c 的十进制值是:()。

A.
64
B.
72
C.
80
D.
120

正确答案D

解析详情
答案 D位运算之左移
思路与推导
  1. 0x0F 对应十进制 15。左移 3 位相当于乘以 2 的 3 次方(即 8)。15 * 8 = 120。二进制来看,00001111 左移 3 位变为 01111000,即 64+32+16+8=120。

第 9 题(单选题,2 分)

补码的情况下,关于按位取反运算,用笔计算的情况下,以下说法错误的是:()

A.
~5 的结果是 -6(int 类型,32 位)
B.
~0 的结果是 0(int 类型,32 位)
C.
~(-3) 的结果是 2(int 类型,32 位)
D.
~8 的结果是 -9(int 类型,32 位)

正确答案B

解析详情
答案 B按位取反运算
思路与推导
  1. 按位取反公式为 ~x = -(x + 1)。因此 ~0 = -(0 + 1) = -1。选项 B 说 ~0 的结果是 0,显然是错误的。其他选项如 ~5 = -6, ~(-3) = 2 均符合该公式。

第 10 题(单选题,2 分)

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

string str = "GESP2026";
string sub = str.substr(4, 2);
A.
20
B.
02
C.
2026
D.
026

正确答案A

解析详情
答案 A字符串 substr 函数
思路与推导
  1. `substr(pos, n)` 函数从索引 `pos` 开始截取长度为 `n` 的子串。"GESP2026" 中索引 4 处的字符是 '2'(G=0, E=1, S=2, P=3, 2=4),截取 2 个字符得到 "20"。

第 11 题(单选题,2 分)

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

int arr[] = {5, 10, 15, 20, 25, 30};
int count = sizeof(arr) / sizeof(arr[0]);
cout << count;
A.
4
B.
6
C.
24
D.
30

正确答案B

解析详情
答案 B数组长度计算
思路与推导
  1. `sizeof(arr)` 返回整个数组占用的总字节数,`sizeof(arr[0])` 返回单个元素占用的字节数。两者相除即得到数组元素的个数。数组中有 6 个元素,故结果为 6。

第 12 题(单选题,2 分)

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

char s[10] = "abcde";
int a = sizeof(s) / sizeof(s[0]);
int b = strlen(s);
cout << a - b;
A.
4
B.
5
C.
6
D.
10

正确答案B

解析详情
答案 Bsizeof 与 strlen 的区别
思路与推导
  1. `sizeof(s)` 返回数组定义的总容量大小,即 10 字节。`strlen(s)` 返回字符串的实际长度,不含 '\0',即 "abcde" 的长度 5。因此 a-b = 10 - 5 = 5。

第 13 题(单选题,2 分)

以下问题中,最不适合用枚举法解决的是:()

A.
找出 1~100 之间所有能被 7 整除的数
B.
找出 100~200 之间的所有质数
C.
计算 1+2+3+...+1000 的和
D.
找出三位数中个位、十位、百位数字之和等于 10 的数

正确答案C

解析详情
答案 C算法选择之枚举法
思路与推导
  1. 枚举法适用于在有限搜索空间内,通过逐一尝试所有可能情况来验证是否满足特定条件的场景。选项 C 是纯数值累加计算,有明确的求和公式(等差数列求和),不需要枚举验证,最不符合枚举思想。

第 14 题(单选题,2 分)

用枚举法解决“鸡兔同笼问题:头共35个,脚共94只,求鸡和兔的数量”,以下枚举逻辑最合理的是:()

A.
枚举鸡的数量 x(0~35),兔的数量 y=35-x,判断 2*x + 4*y == 94
B.
枚举兔的数量 y(0~94),鸡的数量 x=35-y,判断 2*x + 4*y == 94
C.
枚举所有整数 x(0-100)和 y(0-100),判断 x+y==35 && 2*x+4*y==94
D.
枚举脚的总数 sum(0~94),判断 sum == 94

正确答案A

解析详情
答案 A枚举法效率优化
思路与推导
  1. 已知头共 35 个,则鸡的数量 x 的可能范围是 0 到 35。确定 x 后,兔的数量 y 自动确定为 35-x。只需枚举一个变量即可解决问题,时间复杂度最低。C 选项枚举范围过大且包含无关组合,效率较低。

第 15 题(单选题,2 分)

模拟“字符串加密”:规则为“每个字符 ASCII 码 + 3,若超过 z (122) 则从 a 重新开始”,以下代码中正确的条件判断是:()

for (int i = 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] - 23;
D.
if (str[i] + 3 > 'z') str[i] = 'a' + (str[i] + 3 - 'z') - 1;

正确答案D

解析详情
答案 D字符加密与越界处理
思路与推导
  1. 根据规则,需判断增加 3 后的字符是否超过 'z'。若超过,需循环回到字母表开头。D 选项 `str[i] + 3 > 'z'` 判断正确,且计算逻辑 `'a' + (位移量) - 1` 正确模拟了环状替换。

判断题

第 1 题(判断题,2 分)

定义 int arr[5] = {1,2,3};,则 arr[3] 的值为 0,arr[5] 是合法下标。

正确答案错误

解析详情
答案 错误数组初始化与越界
思路与推导
  1. 部分初始化数组时,未指定的元素(如 arr[3])会被初始化为 0。但大小为 5 的数组合法下标范围是 0 到 4,arr[5] 属于越界访问,是不合法的。

第 2 题(判断题,2 分)

定义 double arr[10];未手动初始化时,数组中所有元素的默认值为0.0。

正确答案错误

解析详情
答案 错误变量初始化规则
思路与推导
  1. 在函数内部定义的局部非静态数组,若不进行显式初始化,其内容是未定义的(包含随机垃圾值)。只有全局数组或静态数组才会默认初始化为 0。

第 3 题(判断题,2 分)

定义 int arr[] = {1,2,3};,则 sizeof(arr) 的结果为 12(int 占 4 字节)。

正确答案正确

解析详情
答案 正确sizeof 与数组内存占用
思路与推导
  1. 编译器会根据初始化列表确定数组长度为 3。3 个 int 类型的元素共占用 3 * 4 = 12 字节。

第 4 题(判断题,2 分)

下面的流程图是用来求 1+2+3+…+10 1+2+3+\ldots+10 的和。请判断:这个流程图的逻辑正确还是错误?

image-1

正确答案正确

解析详情
答案 正确流程图逻辑分析
思路与推导
  1. 流程图通过循环变量从 1 递增到 10,并在循环体中不断将当前值累加到总和变量中,循环条件和更新逻辑准确描述了 1 到 10 的累加过程。

第 5 题(判断题,2 分)

下面流程图的功能是计算 5 对 2 取余数,输出结果为 1。

image-2

正确答案正确

解析详情
答案 正确流程图与模运算模拟
思路与推导
  1. 求余数可以通过重复减法实现(5-2-2=1)。流程图模拟了这种逻辑,在 5 大于等于 2 时不断减 2,最终剩余的值即为余数 1。

第 6 题(判断题,2 分)

已知大写字符 A 的ASCII编码的十六进制表示为 0x41,计算字符 m 的ASCII编码的八进制表示为 155(八进制)。

正确答案正确

解析详情
答案 正确ASCII 码与多进制转换
思路与推导
  1. 'A' 是 65 (0x41),则 'Z' 是 90,'a' 是 97,'m' 是第 13 个小写字母,故其 ASCII 码为 97 + 12 = 109。109 转换为八进制:109 ÷ 8 = 13...5,13 ÷ 8 = 1...5,1 ÷ 8 = 0...1,逆序得到 155。结论正确。

第 7 题(判断题,2 分)

在 C++ 位运算中,各种不同的运算符有优先级的区分,使用括号能够解决优先级的问题。

正确答案正确

解析详情
答案 正确运算符优先级与括号
思路与推导
  1. 位运算符(如 &、|、^、<<、>>)的优先级各不相同且通常低于算术运算符。在表达式中使用括号可以显式指定运算顺序,避免因优先级记忆不清导致的逻辑错误。

第 8 题(判断题,2 分)

由于在0~255范围内,char 类型和 int 类型可以互换,因此在这里 x 和 y 相等。

char x = '1';
int y = 1;

正确答案错误

解析详情
答案 错误字符值与数值的区别
思路与推导
  1. 字符变量 x 的值是字符 '1',其数值(ASCII 码)为 49。整型变量 y 的值是数值 1。虽然类型可以隐式转换,但它们的数值不相等。

第 9 题(判断题,2 分)

在C++语言中,表达式 `((0xf0 + 0x15) == 255)` 的值为 true。

正确答案错误

解析详情
答案 错误十六进制数与布尔表达式
思路与推导
  1. 在 C++ 中,`0xf0` 等于 240,`0x15` 等于 21,两者相加得到 261。因为 261 不等于 255,所以表达式 `((0xf0 + 0x15) == 255)` 的值为 false。

第 10 题(判断题,2 分)

如果 a 为 int 类型的变量,且 a 的二进制最低位为 0,则表达式 (a&3&1)==0 (a \& 3 \& 1) == 0 的值为 true。

正确答案正确

解析详情
答案 正确按位与运算及其特性
思路与推导
  1. (a & 3 & 1) 相当于 a & (3 & 1),即 a & 1。由于 a 的二进制最低位为 0,a & 1 的结果必为 0。因此表达式值为 true。