GESP 客观题评测系统

2023-06-Level-2

2023-06-Level-2

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

单选题(每题 2 分)

1 题(单选题

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

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

正确答案D

解析详情

【答案】D

【考点】高级语言程序的编译过程

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

【易错点】容易将"调试"误认为能生成可执行代码,调试是在编译之后进行的排错过程。

2 题(单选题

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

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

正确答案D

解析详情

【答案】D

【考点】流程图与循环结构伪代码

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

【易错点】容易混淆 while 条件判断 和 while not 条件判断 的区别,关键看流程图中"条件满足"走的是退出还是执行。

3 题(单选题

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

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

正确答案B

解析详情

【答案】B

【考点】C++ 基本数据类型与算术运算规则

【解析】 A 错误:char 可以隐式转换赋值给 int,因为 char 本质上存储的是 ASCII 码值。 B 正确:两个 int 相乘,结果仍为 int 类型(即使发生溢出,类型不变)。 C 错误:int 溢出是未定义行为,不会报错崩溃,而是产生不正确的结果(截断/回绕)。 D 错误:double 除以 0.0 不会崩溃,而是得到 inf(正无穷)或 nan。

【易错点】容易误认为整数溢出会导致程序崩溃,实际上 C++ 中整数溢出属于未定义行为,通常表现为数值回绕。

4 题(单选题

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

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

正确答案C

解析详情

【答案】C

【考点】C++ 语法规则;代码块与花括号

【解析】 A 正确:if 语句的条件必须放在小括号内,这是 C++ 语法要求。 B 正确:for(;;) 中省略条件部分等价于条件永真,循环将一直执行。 C 不正确:C++ 不像 Python 那样用缩进来界定代码块。循环体包含多条语句时,必须使用花括号 {} 括起来,而非缩进。缩进只影响可读性,不影响语法。 D 正确:C++ 有丰富的运算符优先级体系,不仅仅是算术运算。

【易错点】学过 Python 的同学容易把"缩进决定代码块"的概念迁移到 C++,但 C++ 依赖花括号而非缩进。

5 题(单选题

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

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

正确答案C

解析详情

【答案】C

【考点】C++ 关键字与标识符

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

【易错点】容易误认为 main 是关键字,实际上 main 只是约定的入口函数名,不是 C++ 保留关键字。

6 题(单选题

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

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

正确答案D

解析详情

【答案】D

【考点】C++ 运算符

【解析】 >= 是大于等于关系运算符,/= 是除法赋值运算符,|| 是逻辑或运算符,这三个都是合法的 C++ 运算符。<> 在 C++ 中不是运算符(它在 Pascal 等语言中表示不等于)。C++ 中不等于应写作 !=。

【易错点】容易混淆不同语言的运算符,<> 在某些语言中是"不等于",但 C++ 中不存在这个运算符。

7 题(单选题

如果 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

解析详情

【答案】D

【考点】C++ 类型转换与左值

【解析】 A 合法:a + 1.0 先将 a 提升为 double 计算,结果隐式转换回 int 赋给 a。 B 合法:(b - '0') 计算字符对应的数字值,(int) 显式转换后赋给 a。 C 合法:(a + '0') 将整数转为对应字符的 ASCII 码,(char) 显式转换后赋给 b。 D 不合法:(int)b 是一个类型转换表达式,产生的是临时右值(rvalue),不能放在赋值号左边。赋值号左边必须是左值(lvalue)。

【易错点】容易忽略"类型转换表达式的结果是右值"这一规则,误以为 (int)b 仍然代表变量 b。

8 题(单选题

如果用两个 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

【考点】整数除法截断与浮点类型提升

【解析】 平行四边形面积守恒:a * h = b * h_b,所以 b 边对应的高 h_b = a * h / b。关键在于要避免整数除法截断。 A:a / b 先做整数除法,结果截断为 0(当 a < b 时),再乘以 (0.0 + h) 已经丢失精度,不能正确计算。 B:0.0 + a * h 先把 a * h 提升为 double,再除以 b,避免了整数截断。 C:b + 0.0 将除数转为 double,a * h / (b + 0.0) 触发浮点除法,正确。 D:(a + 0.0) 将 a 转为 double,后续全程浮点运算,正确。

【易错点】容易忽略 a / b 在 a < b 时整数除法直接截断为 0,导致后续乘法结果也为 0。

9 题(单选题

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

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

解析详情

【答案】B

【考点】bool 类型自增行为与循环终止条件

【解析】 A:a 初始为 0,条件 a 为 false,循环体一次也不执行。 B:b 初始为 false(0),b <= true 即 0 <= 1 成立;b++ 后 b 变为 true(1),1 <= 1 仍成立;再 b++ 后 bool 类型的值不会超过 1(b++ 对 true 仍为 true),所以条件永远满足,无限循环。 C:c 从 'A' 到 'z' 会正常结束(ASCII 65 到 121,有限次)。 D:d 从 0.0 每次加 0.001 最终会达到 10.0 后退出(虽然浮点精度有误差,但最终会超过 10.0)。

【易错点】容易忽略 bool 类型自增的特殊行为——true++ 在 C++ 中结果仍为 true,导致循环条件永远成立。

10 题(单选题

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

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

正确答案D

解析详情

【答案】D

【考点】char 与 int 的隐式类型提升;cout 输出行为

【解析】 a 的值为 'C',ASCII 码为 67。表达式 a + 2 中,char 类型的 a 会被隐式提升为 int,计算结果为 int 类型的 69。cout << 69 输出整数 69。注意如果写成 cout << (char)(a + 2),才会输出字符 'E'。但题目中 (a + 2) 的结果 is int,所以输出数字 69。

【易错点】容易误选 A('E'),认为 char + int 的结果仍是 char 并输出对应字符,实际上 char 参与算术运算后提升为 int。

11 题(单选题

如果 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

【考点】逻辑运算符与关系运算符的正确使用

【解析】 A:(a == b) 判断 a 等于 b,(b == 1) 判断 b 等于 1,两者用 && 连接,等价于 a == b 且 b == 1,即 a == 1 且 b == 1,正确。 B:(a && b) 判断的是 a 和 b 都不为 0,当 a = 2, b = 3 时也为 true,不等价于"都等于 1"。 C:(a == b == 1) 中 a == b 先求值得到 true/false(0 或 1),再与 1 比较。当 a = b = 2 时,a == b 为 1,1 == 1 为 true,但 a 和 b 并不等于 1,判断错误。 D:(a * b == 1) 当 a = 1, b = 1 时成立,但当 a = -1, b = -1 时 (-1)*(-1)=1 也成立,判断错误。

【易错点】容易误选 C,认为 a == b == 1 等价于 a == 1 且 b == 1,但实际上 == 是左结合的,(a == b) 的结果是 bool 再与 1 比较。

12 题(单选题

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

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

正确答案A

解析详情

【答案】A

【考点】字符比较与逻辑运算;范围判断的正确写法

【解析】 A:'0' <= a && a <= '9' 正确判断 a 的 ASCII 码是否在 '0'(48) 到 '9'(57) 范围内,即 a 是否为数字字符。 B:'1' <= a && a <= '0' 中 '1' 的 ASCII 码(49)大于 '0'(48),所以不存在同时满足 a >= '1' 且 a <= '0' 的值,条件永假。且遗漏了 '0'。 C:'0' <= a <= '9' 在 C++ 中不是数学区间判断。'0' <= a 先求值为 true(1) 或 false(0),再与 '9'(57) 比较,0 或 1 都 <= 57,所以条件恒真,判断错误。 D:与 C 类似的连续比较问题,且范围颠倒。

【易错点】容易误选 C,以为 '0' <= a <= '9' 是合法的区间判断,但 C++ 不支持连续比较,必须拆成两个条件用 && 连接。

13 题(单选题

在下列代码的横线处填写(___),使得输出是 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 码运算与类型转换

【解析】 '3' 的 ASCII 码为 51,'6' 的 ASCII 码为 54,'0' 的 ASCII 码为 48。 A:a + b = 51 + 54 = 105,输出整数 105,不是 9。 B:a + b - '0' = 51 + 54 - 48 = 57,输出整数 57,不是 9。 C:(char)(a + b) = (char)(105),输出字符 'i'(ASCII 105),不是 9。 D:(char)(a + b - '0') = (char)(57) = '9',cout 输出字符 '9',显示为 9。正确。

【易错点】容易混淆输出整数和输出字符的区别。(char) 转换后 cout 输出的是字符本身,不是 ASCII 码值。

14 题(单选题

在下列代码的横线处填写(___),可以使得输出是 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

【考点】循环与条件判断;整除(因数)

【解析】 逐个验证: A:i % 3 == 0 的 i 有 3,6,9,12,15,18,和为 63,不是 42。 B:20 % i == 0 即 i 是 20 的因数,i 有 1,2,4,5,10,20,和为 1+2+4+5+10+20 = 42,正确。 C:i <= 8 的 i 有 1~8,和为 36,不是 42。 D:i >= 18 的 i 有 18,19,20,和为 57,不是 42。

【易错点】容易在心算求和时出错,建议逐一列出满足条件的 i 值再求和验证。

15 题(单选题

执行以下 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

【考点】布尔表达式求值;字符遍历

【解析】 逐个字符计算条件表达式的值: x='A':(0)+(0)+(0)+(1) = 1 ≠ 3,不输出。 x='B':(1)+(0)+(0)+(1) = 2 ≠ 3,不输出。 x='C':(1)+(1)+(0)+(1) = 3 == 3,输出 'C'。 x='D':(1)+(0)+(1)+(0) = 2 ≠ 3,不输出。 因此程序只输出 C。

【易错点】容易在计算各布尔子表达式时弄混 != 和 == 的结果,建议列表逐项核算。

判断题(每题 2 分)

1 题(判断题

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

正确答案错误

解析详情

【答案】错误

【考点】计算机存储容量计算;字节与KB换算

【解析】 64KB = 64 × 1024 = 65536 字节。6763 个汉字 × 2 字节 = 13526 字节。13526 / 65536 ≈ 20.6%,即约占 1/5。题目说"不超过 1/5",但实际上 20.6% 已经略微超过了 20%(即 1/5),所以该说法错误。

【易错点】容易粗略估算为"大约 1/5"就判断正确,但精确计算后 13526 > 65536/5 = 13107.2,实际上超过了 1/5。

2 题(判断题

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

正确答案错误

解析详情

【答案】错误

【考点】域名层次结构;顶级域名

【解析】 域名 gesp.ccf.org.cn 中,顶级域名(TLD)是最右边的 .cn(中国国家顶级域名),而不是最左边的 gesp。gesp 是最低级的子域名(四级域名)。域名从右到左依次为:顶级域名 cn → 二级域名 org → 三级域名 ccf → 四级域名 gesp。

【易错点】容易混淆域名层级方向,误认为最左边的是顶级域名,实际上最右边的才是顶级域名。

3 题(判断题

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

正确答案正确

解析详情

【答案】正确

【考点】C++ 头文件与数学函数库

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

【易错点】容易误以为这些函数是 C++ 内置的,不需要头文件就能使用,但它们属于标准库函数,必须包含头文件。

4 题(判断题

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

正确答案错误

解析详情

【答案】错误

【考点】C++ 标识符命名规则;运算符

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

【易错点】前半句是正确的,容易因此整体判断为正确,但要注意后半句关于运算符的说法是错误的。

5 题(判断题

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

正确答案错误

解析详情

【答案】错误

【考点】浮点运算与类型推导

【解析】 a 是 double 类型,值为 3.5。a × 10 中,10 会被隐式提升为 double,计算结果为 35.0,类型仍为 double,而不是 int。虽然数值上等于 35,但结果类型是 double 而非 int,所以该说法错误。

【易错点】容易只关注数值结果是 35 就判断正确,忽略了"结果类型为 int"这个条件——double 与 int 运算的结果类型是 double。

6 题(判断题

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

正确答案正确

解析详情

【答案】正确

【考点】C++ 复合语句(代码块)

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

【易错点】初学者容易忘记加花括号,导致只有第一条语句受 if 控制,后续语句无论条件是否成立都会执行。

7 题(判断题

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

正确答案正确

解析详情

【答案】正确

【考点】死循环(无限循环)

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

【易错点】题目问的是"有可能",不是"一定会"。只要存在这种可能性,命题就成立。

8 题(判断题

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

正确答案错误

解析详情

【答案】错误

【考点】C++ 运算符种类

【解析】 ++ 是自增运算符,== 是相等比较运算符,+= 是加法赋值运算符,三者都是合法的 C++ 运算符。题目说 += 不是运算符,这是错误的。类似地,-=、*=、/=、%= 等复合赋值运算符也都是 C++ 的合法运算符。

【易错点】容易被"+= 看起来是两个符号组合"所误导,但 += 确实是 C++ 定义的独立运算符。

9 题(判断题

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

正确答案正确

解析详情

【答案】正确

【考点】字符 ASCII 码与算术运算

【解析】 'F' 的 ASCII 码为 70,a + 1 = 71,对应字符 'G'。在 ASCII 码表中,大写字母 A-Z 是连续编码的(65-90),所以 'F' + 1 = 'G' 是正确的。赋值回 char 类型的 a 后,a 的值就是 'G'。

【易错点】要注意 ASCII 码表中大写字母是连续排列的,这是该运算成立的前提条件。

10 题(判断题

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

正确答案错误

解析详情

【答案】错误

【考点】数学函数返回类型

【解析】 sqrt(9.0) 的计算结果在数值上确实是 3.0,但 sqrt 函数的返回类型是 double(当参数为 double 时),不是 int。所以结果值为 3.0,类型为 double,题目说"结果类型为 int"是错误的。

【易错点】容易只看数值结果是整数 3 就认为类型是 int,但函数的返回类型由函数声明决定,与结果的数值无关。