GESP 客观题评测系统
2024-09-Level-3
2024-09-Level-3
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题)
下列代码中,输出结果是()
#include<iostream>
using namespace std;
int main()
{
double a = 0.9;
double b = 1.0;
if((b - a) == 0.1)
{
cout << "Equal" << endl;
}
else
{
cout << "Not equal" << endl;
}
}正确答案B
解析详情
【答案】B 【考点】浮点数精度损失、相等性判断 【解析】在计算机中,浮点数(如 double)以二进制形式存储,许多十进制小数(如 0.9 和 0.1)无法精确表示。计算 `1.0 - 0.9` 的结果可能是一个无限接近但并不等于 0.1 的数值(如 0.09999999999999998)。因此,使用 `==` 进行比较时结果为假,程序执行 `else` 分支,输出 "Not equal"。 【易错点】直观认为数学上的 1.0 - 0.9 等于 0.1,忽略了浮点数运算中的精度误差。
第 2 题(单选题)
关于计算机中的编码,下列说法中正确的是()
正确答案C
解析详情
【答案】C 【考点】计算机编码、机器数与真值、原反补码 【解析】机器数是将符号及其值在计算机中的二进制表示,最高位为符号位(0正1负),因此机器数是带符号的,C正确。A错误,机器数包含符号位,其形式值与真值(实际数值)不一致;B错误,原码是符号位加上真值的绝对值;D错误,-1的8位原码是1000 0001,反码是符号位不变其余取反,应为1111 1110。 【易错点】混淆“形式值”与“真值”的概念,或对负数反码计算规则(除符号位外取反)理解不准。
第 3 题(单选题)
8进制数3703转换成16进制数是()
正确答案A
解析详情
【答案】A 【考点】进制转换(八进制转十六进制) 【解析】通常通过二进制中转: 1. 将八进制 3703 转换为二进制:3(011)、7(111)、0(000)、3(011),合起来为 011111000011。 2. 将二进制按四位分组转换为十六进制:从右向左分为 0011(3)、1100(C)、0111(7)。 3. 得到十六进制数为 7C3。 【易错点】在二进制转十六进制的分组过程中,由于位数不足在高位补0时或计算四位二进制值时出错(如 1100 误记为 D)。
第 4 题(单选题)
0.8125变成二进制是()。
正确答案D
解析详情
【答案】D 【考点】十进制小数转二进制 【解析】采用“乘2取整,顺序排列”法: 1. 0.8125 * 2 = 1.625,取 1; 2. 0.625 * 2 = 1.25,取 1; 3. 0.25 * 2 = 0.5,取 0; 4. 0.5 * 2 = 1.0,取 1。 按顺序排列得到 0.1101。 【易错点】计算过程中乘法出错,或结果排列顺序(应从上至下)颠倒。
第 5 题(单选题)
下面说法正确的是()
正确答案C
解析详情
【答案】C 【考点】位运算(按位或) 【解析】将十进制转为二进制:23 是 10111,10 是 01010。进行按位或运算: 10111 (23) | 01010 (10) ----------- 11111 (即十进制 31) 故选项 C 正确。选项 B 中 23|11 (10111|01011) = 31;选项 D 中 23|01 (10111|00001) = 23。 【易错点】十进制与二进制转换出错,或将“或”运算规则(有1则1)记混。
第 6 题(单选题)
下列说法正确的是()
正确答案B
解析详情
【答案】B 【考点】位运算(右移、异或、取反) 【解析】 A. 2>>1 = 1, 1>>1 = 0,不等; B. 2>>2 = 0 (10右移两步), 1>>1 = 0 (1右移一步),相等,正确; C. 11^0 = 11, 1^0 = 1,不等; D. ~0 在补码表示下是对全0序列取反,得到全1序列,即 -1。故选B。 【易错点】对右移导致数值变为0的临界情况不熟悉,或误解 ~0 的计算结果。
第 7 题(单选题)
下列代码实现的是()
void Swap(int &a, int &b) {
if (a != b) {
a ^= b;
b ^= a;
a ^= b;
}
}正确答案C
解析详情
【答案】C 【考点】位运算应用(异或交换) 【解析】这是经典的异或交换算法: 1. a = a ^ b; 2. b = b ^ (a ^ b) = a; 3. a = (a ^ b) ^ a = b; 最终实现了不借用临时变量交换 a 和 b 的值。if 判断 a != b 是为了防止同一地址变量异或后归零。 【易错点】由于看到大量异或符号,误选 A 或 B,需识别该固定算法模式。
第 8 题(单选题)
a&~1运算实现的是()。
正确答案C
解析详情
【答案】C 【考点】位运算应用(掩码清零) 【解析】1 的二进制最低位为 1,其余为 0。~1 的结果是最低位为 0,其余高位全为 1。将 a 与 ~1 进行按位与运算,高位与 1 相与保持不变,最低位与 0 相与结果必为 0。因此该运算实现了使 a 的最低位清零。 【易错点】混淆按位与(&)和按位或(|)在位操作中的提取与修改功能。
第 9 题(单选题)
a=1010 1110, a<<2, 下面关于这个说法正确的是()。
正确答案A
解析详情
【答案】A 【考点】位运算(左移) 【解析】左移运算 a<<2 会将所有位向左平移 2 位。原数为 1010 1110,左移两位后,高位的 10 被移出丢弃,末尾补入 2 个 0,结果变为 1011 1000。 【易错点】移位后末尾补位出错(应补0)或对高位溢出的处理理解模糊。
第 10 题(单选题)
下列程序中,result和result2输出分别是()
long a = 123;
int b = 1;
long result = a & b;
cout<<result<<endl;
long a2 = -123;
unsigned int b2 = -1;
long result2 = a2 & b2;
cout<<result2<<endl;正确答案D
解析详情
【答案】D 【考点】位运算、补码、无符号数与混合运算 【解析】 1. `123 & 1`:123 是奇数,最低位为 1,与 1 进行按位与结果为 1。 2. `-123 & (unsigned int)-1`:`-1` 赋给 `unsigned int` 得到全 1 序列(如 0xFFFFFFFF)。当 `long` 类型的 -123 与全 1 序列进行按位与时,结果取决于具体的位数,但通常这类题目考查全 1 掩码对原数值低位的保留。由选项可知结果为 -123。 【易错点】不清楚 -1 在无符号整型中以全 1 表示,或混淆了不同类型进行位运算时的扩展规则。
第 11 题(单选题)
陈大爷种植一批农作物,第一天需要浇水一次,随后的两天(第2、第3天),每天需要浇水2次,再随后的3天(第4、第5、第6天),需要每天浇水3次,这样持续下去,随后的n天,每天需要浇水n次。请问在100天里,总共浇了多少次水()
正确答案D
解析详情
【答案】D 【考点】数列求和、逻辑推理 【解析】浇水规律是:第 k 阶段持续 k 天,每天浇 k 次。1. 计算 100 天包含哪些阶段:1+2+...+k = k(k+1)/2 ≤ 100。当 k=13 时天数为 91。2. 前 13 个阶段总次数为 ∑i² (i 从 1 到 13) = 13*14*27/6 = 819 次。3. 剩余 100-91=9 天。这 9 天属于第 14 阶段,每天浇 14 次,共 126 次。4. 总计 819+126=945。故选D。 【易错点】未能正确计算阶段总天数,或在计算平方和时出错。
第 12 题(单选题)
关于一维数组,下列程序能够正确执行的是()。
int a[10];
int sum=0;
for(int i=0;i<=10;i++) {
sum=sum+a[i];
}int a[10]={1,2,3,4,5,6,7,8,9,10};
int sum=0;
for(int i=0;i<=10;i++) {
sum=sum+a[i];
}int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = 0;
for (int i = 0; i < 10; i++) {
sum = sum + a[i];
}int a[10]={0};
int sum=0;
for(int i=0;i<=10;i++) {
sum=sum+a[i];
}正确答案C
解析详情
【答案】C 【考点】数组下标越界 【解析】在 C++ 中,`int a[10]` 的合法索引范围是 0 到 9。选项 A、B、D 的循环条件均为 `i <= 10`,当 i=10 时访问 `a[10]` 属于下标越界。选项 C 循环条件 `i < 10` 能够正确访问到所有 10 个元素且不越界。 【易错点】忽略 C++ 数组索引从 0 开始,常犯“多 1”越界错误。
第 13 题(单选题)
下面的程序中,会输出()。
int a[10]={1,2,3,4,5,6,7,8,9,10};
cout<<a[10]<<endl;正确答案D
解析详情
【答案】D 【考点】未定义行为、数组越界访问 【解析】定义 `int a[10]` 后,合法的最大下标是 9。代码中试图输出 `a[10]`,属于非法越界访问内存。在 C++ 中,这种行为不会报编译错误,但会读取该内存位置上的随机垃圾数据,输出是不确定的。 【易错点】误以为 `a[10]` 是最后一个元素(应为 a[9])。
第 14 题(单选题)
有ABCD4个人,其中一个是小偷,每个人说一句话,只有小偷说的是假话,其中A说:不是我。B说:是 C。C说:是D。D说:C瞎说,请问谁是小偷()。
正确答案C
解析详情
【答案】C 【考点】逻辑推理 【解析】采用假设法:若 C 是小偷,则 A、B 说的是真话(不是 A,是 C),C 说的是假话(是 D),D 说的是真话(C 瞎说)。这符合“只有小偷说假话”且只有一人是小偷的条件。若假设其他人是小偷,均会导致至少两句假话或逻辑冲突。 【易错点】在多个条件冲突时分析不细致,未能建立完整的真假逻辑链。
第 15 题(单选题)
下列程序输出的是()
string str = "Hello,CHAD";
cout << str.find("A") << '\n';正确答案B
解析详情
【答案】B 【考点】字符串查找(find) 【解析】字符串索引从 0 开始。在 "Hello,CHAD" 中:H(0), e(1), l(2), l(3), o(4), ,(5), C(6), H(7), A(8), D(9)。字符 'A' 第一次出现的下标是 8。因此返回 8。 【易错点】从 1 开始计数或数错下标位置。
判断题(每题 2 分)
第 1 题(判断题)
+1和-1的原码进行1+(-1)计算的结果是-2。()
正确答案正确
解析详情
【答案】正确 【考点】原码运算缺陷 【解析】在 8 位原码下,[+1]原=0000 0001,[-1]原=1000 0001。相加得 1000 0010。该结果按原码解析即为 -2。这正体现了原码在进行正负数混合加法时的逻辑缺陷(符号位未参与有效进位处理)。 【易错点】误以为 1+(-1) 在任何情况下计算结果必然是 0。
第 2 题(判断题)
~1的输出值是-2。()
正确答案正确
解析详情
【答案】正确 【考点】按位取反、补码运算 【解析】1 的补码是 00...01。按位取反后变为 11...10。在补码体系中,最高位为 1 表示负数,对该补码求原码:减 1 得 11...01,取反(符号位除外)得 10...10,对应十进制 -2。 【易错点】认为取反只是简单的 0 变 1,而未结合补码规则计算其实际数值。
第 3 题(判断题)
~1 = 1111 1110。()
正确答案正确
解析详情
【答案】正确 【考点】位运算(取反) 【解析】假设在 8 位环境下,数值 1 的二进制为 0000 0001。执行按位取反(~)后,每一位 0 变 1,1 变 0,结果为 1111 1110。断言正确。 【易错点】对取反操作中各数位的转换出现笔误。
第 4 题(判断题)
取X的低四位,可以用Y = 0000 1111,用X&Y获取X的低四位。
正确答案正确
解析详情
【答案】正确 【考点】位运算应用(掩码提取) 【解析】按位与(&)运算的特性是:x & 1 = x, x & 0 = 0。通过构造低四位全为 1 的掩码 0000 1111,可以使 X 的高位清零而保留低四位。这是常用的位提取操作。 【易错点】将“与”运算和“或”运算的功能记混。
第 5 题(判断题)
下列程序输出的是 A。()
char x = 65;
x++;
cout << x++ << endl;正确答案错误
解析详情
【答案】错误 【考点】字符编码、后置自增运算 【解析】1. `x=65` 是字符 'A';2. `x++` 后 x 变为 66,即 'B';3. `cout << x++` 是后置自增,先输出当前值 'B' 再加 1。因此屏幕实际输出的是 B,断言错误。 【易错点】对后置自增“先用后加”的顺序掌握不牢。
第 6 题(判断题)
下列程序输出的是 3。()
string str="CHADai";
size_t pos = str.find('D');
cout<<pos<<endl;正确答案正确
解析详情
【答案】正确 【考点】字符串查找(find) 【解析】在 "CHADai" 中,字符 'C' 索引 0,'H' 索引 1,'A' 索引 2,'D' 索引 3。`find` 函数返回该字符第一次出现的索引值 3。断言正确。 【易错点】误以为索引从 1 开始。
第 7 题(判断题)
下列程序将输出 1。()
int a[10]={1};
cout<<a[1]<<endl;正确答案错误
解析详情
【答案】错误 【考点】数组部分初始化规则 【解析】在 C++ 中,`int a[10]={1}` 只将第一个元素 a[0] 初始化为 1,其余元素(包括 a[1])会自动初始化为 0。因此输出为 0,断言错误。 【易错点】认为初始化列表中的值会填充整个数组。
第 8 题(判断题)
下列程序将输出 A。()
int a=65;
cout<<(char)a<<endl;正确答案正确
解析详情
【答案】正确 【考点】强制类型转换、ASCII 码 【解析】ASCII 码中,65 对应大写字母 'A'。程序将整型 a 强转为字符型输出,结果为 A。断言正确。 【易错点】不熟悉常用字符的 ASCII 码值。
第 9 题(判断题)
16进制数 AB,表示成2进制数是 10101011。()
正确答案正确
解析详情
【答案】正确 【考点】十六进制转二进制 【解析】十六进制 A 为 10,对应二进制 1010;十六进制 B 为 11,对应二进制 1011。拼合即为 10101011。断言正确。 【易错点】转换位对应不准确。
第 10 题(判断题)
def (十六进制) = 103231 (五进制)。()
正确答案错误
解析详情
【答案】错误 【考点】多进制转换计算 【解析】1. 十六进制 def = 13*256 + 14*16 + 15 = 3567;2. 五进制 103231 = 1*3125 + 0 + 3*125 + 2*25 + 3*5 + 1 = 3125 + 375 + 50 + 15 + 1 = 3566。两者不相等(差 1),故断言错误。 【易错点】在处理高次方幂(如 5^5)计算时产生细微误差。