GESP 客观题评测系统

试卷解析 · 理解每一步

2023-06-Level-2

2023-06-Level-2

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

单选题

第 1 题(单选题,2 分)

高级语言编写的程序需要经过以下()操作,可以生成在计算机上运行的可执行代码。

A.
编辑
B.
保存
C.
调试
D.
编译

正确答案D

解析详情
答案 D高级语言程序的编译过程
思路与推导
  1. 高级语言编写的源代码不能直接被计算机执行,需要经过编译器编译,将源代码翻译成机器语言(可执行代码)。编辑只是修改代码文本,保存只是将文件写入磁盘,调试是查找程序错误的过程,它们都不会生成可执行代码。只有编译才能将高级语言程序转换为可执行代码。

第 2 题(单选题,2 分)

能够实现下面流程图功能的伪代码是()。

Image
A.
if 条件判断 then 语句块
B.
if 条件判断 then 什么也不做 else 语句块
C.
while 条件判断 do 语句块
D.
while not 条件判断 do 语句块

正确答案D

解析详情
答案 D流程图与循环结构伪代码
思路与推导
  1. 流程图中先进行条件判断,条件不满足时执行语句块并回到判断处,条件满足时退出循环。这是一种"当条件不成立时循环"的结构,对应 while not 条件判断 do 语句块。A 和 B 是分支结构(if),不会循环回去。C 是"当条件成立时循环",与流程图中的逻辑方向相反。

第 3 题(单选题,2 分)

下列关于 C++语言的叙述,正确的是()。

A.
char 类型变量不能赋值给 int 类型的变量。
B.
两个 int 类型变量相乘,计算结果还是 int 类型。
C.
计算两个 int 类型变量相乘时,如果乘积超出了 int 类型的取值范围,程序会报错崩溃。
D.
计算两个 double 类型变量相除时,如果除数的值为 0.0,程序会报错崩溃。

正确答案B

解析详情
答案 BC++ 基本数据类型与算术运算规则
思路与推导
  1. A 错误:char 可以隐式转换赋值给 int,因为 char 本质上存储的是 ASCII 码值。

  2. B 正确:两个 int 相乘,结果仍为 int 类型(即使发生溢出,类型不变)。

  3. C 错误:int 溢出是未定义行为,不会报错崩溃,而是产生不正确的结果(截断/回绕)。

  4. D 错误:double 除以 0.0 不会崩溃,而是得到 inf(正无穷)或 nan。

第 4 题(单选题,2 分)

下列关于 C++语言的叙述,不正确的是()。

A.
if 语句中的判断条件必须用小括号 '(' 和 ')' 括起来。
B.
for 语句中两个 ';' 之间的循环条件可以省略,表示循环继续执行的条件一直满足。
C.
循环体包含多条语句时,可以用缩进消除二义性。
D.
除了 "先乘除、后加减",还有很多运算符优先级。

正确答案C

解析详情
答案 CC++ 语法规则;代码块与花括号
思路与推导
  1. A 正确:if 语句的条件必须放在小括号内,这是 C++ 语法要求。

  2. B 正确:for(;;) 中省略条件部分等价于条件永真,循环将一直执行。

  3. C 不正确:C++ 不像 Python 那样用缩进来界定代码块。循环体包含多条语句时,必须使用花括号 {} 括起来,而非缩进。缩进只影响可读性,不影响语法。

  4. D 正确:C++ 有丰富的运算符优先级体系,不仅仅是算术运算。

第 5 题(单选题,2 分)

以下哪个是 C++语言的关键字?()

A.
main
B.
max
C.
double
D.
sqrt

正确答案C

解析详情
答案 CC++ 关键字与标识符
思路与推导
  1. double 是 C++ 的内置浮点类型关键字,属于语言保留字。main 是程序入口函数名但不是关键字,可以用作变量名(虽然不推荐)。max 是标准库中的函数名。sqrt 是 <cmath> 中的数学函数名。只有 double 是 C++ 语言规范规定的关键字。

第 6 题(单选题,2 分)

以下哪个不是 C++语言的运算符?()

A.
>=
B.
/=
C.
||
D.
<>

正确答案D

解析详情
答案 DC++ 运算符
思路与推导
  1. >= 是大于等于关系运算符,/= 是除法赋值运算符,|| 是逻辑或运算符,这三个都是合法的 C++ 运算符。<> 在 C++ 中不是运算符(它在 Pascal 等语言中表示不等于)。C++ 中不等于应写作 !=。

第 7 题(单选题,2 分)

如果 a 为 int 类型的变量,b 为 char 类型的变量,则下列哪个语句不符合 C++语法?()

A.
a = a + 1.0;
B.
a = (int)(b - '0');
C.
b = (char)(a + '0');
D.
(int)b = a;

正确答案D

解析详情
答案 DC++ 类型转换与左值
思路与推导
  1. A 合法:a + 1.0 先将 a 提升为 double 计算,结果隐式转换回 int 赋给 a。

  2. B 合法:(b - '0') 计算字符对应的数字值,(int) 显式转换后赋给 a。

  3. C 合法:(a + '0') 将整数转为对应字符的 ASCII 码,(char) 显式转换后赋给 b。

  4. D 不合法:(int)b 是一个类型转换表达式,产生的是临时右值(rvalue),不能放在赋值号左边。赋值号左边必须是左值(lvalue)。

第 8 题(单选题,2 分)

如果用两个 int 类型的变量 a 和 b 分别表达平行四边形的两条边长,用 int 类型的变量 h 表达 a 边对应的高,则下列哪个表达式不能用来计算 b 边对应的高?()

A.
a / b * (0.0 + h)
B.
(0.0 + a * h) / b
C.
a * h / (b + 0.0)
D.
(a + 0.0) * h / b

正确答案A

解析详情
答案 A整数除法截断与浮点类型提升
思路与推导
  1. 平行四边形面积守恒:a * h = b * h_b,所以 b 边对应的高 h_b = a * h / b。关键在于要避免整数除法截断。

  2. A:a / b 先做整数除法,结果截断为 0(当 a < b 时),再乘以 (0.0 + h) 已经丢失精度,不能正确计算。

  3. B:0.0 + a * h 先把 a * h 提升为 double,再除以 b,避免了整数截断。

  4. C:b + 0.0 将除数转为 double,a * h / (b + 0.0) 触发浮点除法,正确。

  5. D:(a + 0.0) 将 a 转为 double,后续全程浮点运算,正确。

第 9 题(单选题,2 分)

以下哪个循环语句会无限次执行?( )

A.
for (int a = 0; a; a++) ;
B.
for (bool b = false; b <= true; b++) ;
C.
for (char c = 'A'; c < 'z'; c++) ;
D.
for (double d = 0.0; d < 10.0; d += 0.001) ;

正确答案B

解析详情
答案 Bbool 类型自增行为与循环终止条件
思路与推导
  1. A:a 初始为 0,条件 a 为 false,循环体一次也不执行。

  2. B:b 初始为 false(0),b <= true 即 0 <= 1 成立;b++ 后 b 变为 true(1),1 <= 1 仍成立;再 b++ 后 bool 类型的值不会超过 1(b++ 对 true 仍为 true),所以条件永远满足,无限循环。

  3. C:c 从 'A' 到 'z' 会正常结束(ASCII 65 到 121,有限次)。

  4. D:d 从 0.0 每次加 0.001 最终会达到 10.0 后退出(虽然浮点精度有误差,但最终会超过 10.0)。

第 10 题(单选题,2 分)

如果 a 为 char 类型的变量,且 a 的值为 'C'(已知 'C' 的 ASCII 码为 67),则执行 cout << (a + 2); 会输出( )。

A.
E
B.
C+2
C.
C2
D.
69

正确答案D

解析详情
答案 Dchar 与 int 的隐式类型提升;cout 输出行为
思路与推导
  1. a 的值为 'C',ASCII 码为 67。表达式 a + 2 中,char 类型的 a 会被隐式提升为 int,计算结果为 int 类型的 69。cout << 69 输出整数 69。注意如果写成 cout << (char)(a + 2),才会输出字符 'E'。但题目中 (a + 2) 的结果 is int,所以输出数字 69。

第 11 题(单选题,2 分)

如果 a 和 b 均为 int 类型的变量,下列表达式能正确判断 "a 等于 1 且 b 等于 1" 的是()。

A.
(a == b) && (b == 1)
B.
(a && b)
C.
(a == b == 1)
D.
(a * b == 1)

正确答案A

解析详情
答案 A逻辑运算符与关系运算符的正确使用
思路与推导
  1. A:(a == b) 判断 a 等于 b,(b == 1) 判断 b 等于 1,两者用 && 连接,等价于 a == b 且 b == 1,即 a == 1 且 b == 1,正确。

  2. B:(a && b) 判断的是 a 和 b 都不为 0,当 a = 2, b = 3 时也为 true,不等价于"都等于 1"。

  3. C:(a == b == 1) 中 a == b 先求值得到 true/false(0 或 1),再与 1 比较。当 a = b = 2 时,a == b 为 1,1 == 1 为 true,但 a 和 b 并不等于 1,判断错误。

  4. D:(a * b == 1) 当 a = 1, b = 1 时成立,但当 a = -1, b = -1 时 (-1)*(-1)=1 也成立,判断错误。

第 12 题(单选题,2 分)

如果 a 为 char 类型的变量,下列哪个表达式可以正确判断 “a 是数字”?

( )
A.
'0' <= a && a <= '9'
B.
'1' <= a && a <= '0'
C.
'0' <= a <= '9'
D.
'1' <= a <= '0'

正确答案A

解析详情
答案 A字符比较与逻辑运算;范围判断的正确写法
思路与推导
  1. A:'0' <= a && a <= '9' 正确判断 a 的 ASCII 码是否在 '0'(48) 到 '9'(57) 范围内,即 a 是否为数字字符。

  2. B:'1' <= a && a <= '0' 中 '1' 的 ASCII 码(49)大于 '0'(48),所以不存在同时满足 a >= '1' 且 a <= '0' 的值,条件永假。且遗漏了 '0'。

  3. C:'0' <= a <= '9' 在 C++ 中不是数学区间判断。'0' <= a 先求值为 true(1) 或 false(0),再与 '9'(57) 比较,0 或 1 都 <= 57,所以条件恒真,判断错误。

  4. D:与 C 类似的连续比较问题,且范围颠倒。

第 13 题(单选题,2 分)

在下列代码的横线处填写(___),使得输出是 9。

#include <iostream>
using namespace std;
int main() {
    char a = '3', b = '6';
    cout << _____; // 在此处填入代码
    return 0;
}
A.
(a + b)
B.
(a + b - '0')
C.
(char)(a + b)
D.
(char)(a + b - '0')

正确答案D

解析详情
答案 D字符 ASCII 码运算与类型转换
思路与推导
  1. '3' 的 ASCII 码为 51,'6' 的 ASCII 码为 54,'0' 的 ASCII 码为 48。

  2. A:a + b = 51 + 54 = 105,输出整数 105,不是 9。

  3. B:a + b - '0' = 51 + 54 - 48 = 57,输出整数 57,不是 9。

  4. C:(char)(a + b) = (char)(105),输出字符 'i'(ASCII 105),不是 9。

  5. D:(char)(a + b - '0') = (char)(57) = '9',cout 输出字符 '9',显示为 9。正确。

第 14 题(单选题,2 分)

在下列代码的横线处填写(___),可以使得输出是 42。

#include <iostream>
using namespace std;
int main() {
    int sum = 0;
    for (int i = 1; i <= 20; i++)
        if (____) // 在此处填入代码
            sum += i;
        cout << sum << endl;
        return 0;
}
A.
i % 3 == 0
B.
20 % i == 0
C.
i <= 8
D.
i >= 18

正确答案B

解析详情
答案 B循环与条件判断;整除(因数)
思路与推导
  1. 逐个验证:

  2. A:i % 3 == 0 的 i 有 3,6,9,12,15,18,和为 63,不是 42。

  3. B:20 % i == 0 即 i 是 20 的因数,i 有 1,2,4,5,10,20,和为 1+2+4+5+10+20 = 42,正确。

  4. C:i <= 8 的 i 有 1~8,和为 36,不是 42。

  5. D:i >= 18 的 i 有 18,19,20,和为 57,不是 42。

第 15 题(单选题,2 分)

执行以下 C++ 语言程序后,输出结果是()。

#include <iostream>
using namespace std;
int main() {
    for (char x = 'A'; x <= 'D'; x++)
        if ((x != 'A') + (x == 'C') + (x == 'D') + (x != 'D') == 3)
            cout << x;
    return 0;
}
A.
A
B.
B
C.
C
D.
D

正确答案C

解析详情
答案 C布尔表达式求值;字符遍历
思路与推导
  1. 逐个字符计算条件表达式的值:

  2. x='A':(0)+(0)+(0)+(1) = 1 ≠ 3,不输出。

  3. x='B':(1)+(0)+(0)+(1) = 2 ≠ 3,不输出。

  4. x='C':(1)+(1)+(0)+(1) = 3 == 3,输出 'C'。

  5. x='D':(1)+(0)+(1)+(0) = 2 ≠ 3,不输出。

  6. 因此程序只输出 C。

判断题

第 1 题(判断题,2 分)

诞生于1986年的中华学习机CEC-I入选了2021年的CCF计算机历史记忆(一类),它的内存只有64KB。当时的汉字编码字符集GB2312中共有6763个汉字,假如每个汉字用2个字节编码,将整个GB2312汉字字符集都放入CEC-I的内存,也只占用了不超过1/5的内存空间。

正确答案错误

解析详情
答案 错误计算机存储容量计算;字节与KB换算
思路与推导
  1. 64KB = 64 × 1024 = 65536 字节。6763 个汉字 × 2 字节 = 13526 字节。13526 / 65536 ≈ 20.6%,即约占 1/5。题目说"不超过 1/5",但实际上 20.6% 已经略微超过了 20%(即 1/5),所以该说法错误。

第 2 题(判断题,2 分)

域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF编程能力等级认证官方网站的域名是 gesp.ccf.org.cn,其中顶级域名是 gesp。

正确答案错误

解析详情
答案 错误域名层次结构;顶级域名
思路与推导
  1. 域名 gesp.ccf.org.cn 中,顶级域名(TLD)是最右边的 .cn(中国国家顶级域名),而不是最左边的 gesp。gesp 是最低级的子域名(四级域名)。域名从右到左依次为:顶级域名 cn → 二级域名 org → 三级域名 ccf → 四级域名 gesp。

第 3 题(判断题,2 分)

在使用 C++语言编写程序时,不能使用 sqrt、abs 等数学函数,包含<cmath>或<math.h>头文件后就能够使用了。

正确答案正确

解析详情
答案 正确C++ 头文件与数学函数库
思路与推导
  1. sqrt、abs 等数学函数定义在 <cmath>(C++ 风格)或 <math.h>(C 风格)头文件中。在没有包含这些头文件时,编译器不认识这些函数,不能直接使用。包含相应头文件后,函数声明可见,就可以正常调用了。

第 4 题(判断题,2 分)

在 C++语言中,标识符中可以有下划线 '_'。同时,'_' 也是 C++语言的运算符。

正确答案错误

解析详情
答案 错误C++ 标识符命名规则;运算符
思路与推导
  1. 前半句正确:C++ 标识符可以包含下划线 '_',例如 my_var、_count 都是合法标识符。但后半句错误:'_' 不是 C++ 的运算符。C++ 的运算符包括 +、-、*、/、%、=、==、!=、&&、|| 等,下划线不在其中。两个条件必须同时成立命题才为真,所以整体为错误。

第 5 题(判断题,2 分)

如果 a 是 double 类型的变量,而且值为 3.5,则表达式a×10a \times 10的计算结果为 35,且结果类型为 int。

正确答案错误

解析详情
答案 错误浮点运算与类型推导
思路与推导
  1. a 是 double 类型,值为 3.5。a × 10 中,10 会被隐式提升为 double,计算结果为 35.0,类型仍为 double,而不是 int。虽然数值上等于 35,但结果类型是 double 而非 int,所以该说法错误。

第 6 题(判断题,2 分)

在 if 语句中,如果条件成立时需要执行多条语句,可以使用大括号 '{' 和 '}' 将这些语句括起来。

正确答案正确

解析详情
答案 正确C++ 复合语句(代码块)
思路与推导
  1. 在 C++ 中,if 语句默认只控制紧跟其后的一条语句。如果需要在条件成立时执行多条语句,必须用花括号 {} 将它们组成一个复合语句(代码块)。这是 C++ 的基本语法规则。

第 7 题(判断题,2 分)

循环语句的循环体有可能无限制地执行下去。

正确答案正确

解析详情
答案 正确死循环(无限循环)
思路与推导
  1. 如果循环条件始终为真且没有 break 等跳出机制,循环体就会无限执行。例如 while(true) {} 或 for(;;) {} 都是死循环。因此循环语句的循环体"有可能"无限执行下去,这个说法是正确的。

第 8 题(判断题,2 分)

++和==都是 C++语言的运算符,但+=不是。

正确答案错误

解析详情
答案 错误C++ 运算符种类
思路与推导
  1. ++ 是自增运算符,== 是相等比较运算符,+= 是加法赋值运算符,三者都是合法的 C++ 运算符。题目说 += 不是运算符,这是错误的。类似地,-=、*=、/=、%= 等复合赋值运算符也都是 C++ 的合法运算符。

第 9 题(判断题,2 分)

如果 a 为 char 类型的变量,且取值为大写字母'F',则执行语句 a = a + 1;后,a 的值会变为大写字母'G'。

正确答案正确

解析详情
答案 正确字符 ASCII 码与算术运算
思路与推导
  1. 'F' 的 ASCII 码为 70,a + 1 = 71,对应字符 'G'。在 ASCII 码表中,大写字母 A-Z 是连续编码的(65-90),所以 'F' + 1 = 'G' 是正确的。赋值回 char 类型的 a 后,a 的值就是 'G'。

第 10 题(判断题,2 分)

表达式9.0\sqrt{9.0}的计算结果为 3,且结果类型为 int。

正确答案错误

解析详情
答案 错误数学函数返回类型
思路与推导
  1. sqrt(9.0) 的计算结果在数值上确实是 3.0,但 sqrt 函数的返回类型是 double(当参数为 double 时),不是 int。所以结果值为 3.0,类型为 double,题目说"结果类型为 int"是错误的。