GESP 客观题评测系统

试卷解析 · 理解每一步

2024-09-Level-3

2024-09-Level-3

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

单选题

第 1 题(单选题,2 分)

下列代码中,输出结果是()

#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;
    }
}
A.
Equal
B.
Not equal
C.
程序不能正确执行
D.
没有输出

正确答案B

解析详情
答案 B浮点数精度损失、相等性判断
思路与推导
  1. 在计算机中,浮点数(如 double)以二进制形式存储,许多十进制小数(如 0.9 和 0.1)无法精确表示。计算 `1.0 - 0.9` 的结果可能是一个无限接近但并不等于 0.1 的数值(如 0.09999999999999998)。因此,使用 `==` 进行比较时结果为假,程序执行 `else` 分支,输出 "Not equal"。

第 2 题(单选题,2 分)

关于计算机中的编码,下列说法中正确的是()

A.
机器数的形式值和真值是一致的
B.
原码就是符号位加上真值
C.
机器数是带符号的
D.
[−1]=[1000 0001][-1]=[1000\ 0001]原 = [1111 1111] 反

正确答案C

解析详情
答案 C计算机编码、机器数与真值、原反补码
思路与推导
  1. 机器数是将符号及其值在计算机中的二进制表示,最高位为符号位(0正1负),因此机器数是带符号的,C正确。A错误,机器数包含符号位,其形式值与真值(实际数值)不一致;B错误,原码是符号位加上真值的绝对值;D错误,-1的8位原码是1000 0001,反码是符号位不变其余取反,应为1111 1110。

第 3 题(单选题,2 分)

8进制数3703转换成16进制数是()

A.
7C3
B.
7A3
C.
7B3
D.
7D3

正确答案A

解析详情
答案 A进制转换(八进制转十六进制)
思路与推导
  1. 通常通过二进制中转:

  2. 1. 将八进制 3703 转换为二进制:3(011)、7(111)、0(000)、3(011),合起来为 011111000011。

  3. 2. 将二进制按四位分组转换为十六进制:从右向左分为 0011(3)、1100(C)、0111(7)。

  4. 3. 得到十六进制数为 7C3。

第 4 题(单选题,2 分)

0.8125变成二进制是()。

A.
0.1110
B.
0.1 1111 1011 1101
C.
0.1 1111 1011 1100
D.
0.1101

正确答案D

解析详情
答案 D十进制小数转二进制
思路与推导
  1. 采用“乘2取整,顺序排列”法:

  2. 1. 0.8125 * 2 = 1.625,取 1;

  3. 2. 0.625 * 2 = 1.25,取 1;

  4. 3. 0.25 * 2 = 0.5,取 0;

  5. 4. 0.5 * 2 = 1.0,取 1。

  6. 按顺序排列得到 0.1101。

第 5 题(单选题,2 分)

下面说法正确的是()

A.
(22&01) = (22&01) 成立
B.
(23|11) = 30
C.
(23|10) = 31
D.
(23|01) = 31

正确答案C

解析详情
答案 C位运算(按位或)
思路与推导
  1. 将十进制转为二进制:23 是 10111,10 是 01010。进行按位或运算:

  2. 10111 (23)

  3. | 01010 (10)

  4. -----------

  5. 11111 (即十进制 31)

  6. 故选项 C 正确。选项 B 中 23|11 (10111|01011) = 31;选项 D 中 23|01 (10111|00001) = 23。

第 6 题(单选题,2 分)

下列说法正确的是()

A.
2>>1和1>>1的值是一样的
B.
(2>>2)和(1>>1)的值是一样的
C.
(11^00)和(1^0)的值是一样的
D.
(~0的输出值是1)

正确答案B

解析详情
答案 B位运算(右移、异或、取反)
思路与推导
  1. A. 2>>1 = 1, 1>>1 = 0,不等;

  2. B. 2>>2 = 0 (10右移两步), 1>>1 = 0 (1右移一步),相等,正确;

  3. C. 11^0 = 11, 1^0 = 1,不等;

  4. D. ~0 在补码表示下是对全0序列取反,得到全1序列,即 -1。故选B。

第 7 题(单选题,2 分)

下列代码实现的是()

void Swap(int &a, int &b) {
    if (a != b) {
        a ^= b;
        b ^= a;
        a ^= b;
    }
}
A.
a和b的异或
B.
a和b的同或
C.
a和b的值交换
D.
a和b的高低位互换

正确答案C

解析详情
答案 C位运算应用(异或交换)
思路与推导
  1. 这是经典的异或交换算法:

  2. 1. a = a ^ b;

  3. 2. b = b ^ (a ^ b) = a;

  4. 3. a = (a ^ b) ^ a = b;

  5. 最终实现了不借用临时变量交换 a 和 b 的值。if 判断 a != b 是为了防止同一地址变量异或后归零。

第 8 题(单选题,2 分)

a&~1运算实现的是()。

A.
使a的最低位为1
B.
使a的最高位为1
C.
使a的最低位为0
D.
使a的最高位为0

正确答案C

解析详情
答案 C位运算应用(掩码清零)
思路与推导
  1. 1 的二进制最低位为 1,其余为 0。~1 的结果是最低位为 0,其余高位全为 1。将 a 与 ~1 进行按位与运算,高位与 1 相与保持不变,最低位与 0 相与结果必为 0。因此该运算实现了使 a 的最低位清零。

第 9 题(单选题,2 分)

a=1010 1110, a<<2, 下面关于这个说法正确的是()。

A.
a的值变为1011 1000
B.
a的值变为1011 1010
C.
a的值变为0101 1101
D.
a的值变为0101 1100

正确答案A

解析详情
答案 A位运算(左移)
思路与推导
  1. 左移运算 a<<2 会将所有位向左平移 2 位。原数为 1010 1110,左移两位后,高位的 10 被移出丢弃,末尾补入 2 个 0,结果变为 1011 1000。

第 10 题(单选题,2 分)

下列程序中,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;
A.
123 -1
B.
123 -123
C.
1 -1
D.
1 -123

正确答案D

解析详情
答案 D位运算、补码、无符号数与混合运算
思路与推导
  1. 1. `123 & 1`:123 是奇数,最低位为 1,与 1 进行按位与结果为 1。

  2. 2. `-123 & (unsigned int)-1`:`-1` 赋给 `unsigned int` 得到全 1 序列(如 0xFFFFFFFF)。当 `long` 类型的 -123 与全 1 序列进行按位与时,结果取决于具体的位数,但通常这类题目考查全 1 掩码对原数值低位的保留。由选项可知结果为 -123。

第 11 题(单选题,2 分)

陈大爷种植一批农作物,第一天需要浇水一次,随后的两天(第2、第3天),每天需要浇水2次,再随后的3天(第4、第5、第6天),需要每天浇水3次,这样持续下去,随后的n天,每天需要浇水n次。请问在100天里,总共浇了多少次水()

A.
994
B.
996
C.
995
D.
945

正确答案D

解析详情
答案 D数列求和、逻辑推理
思路与推导
  1. 浇水规律是:第 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 题(单选题,2 分)

关于一维数组,下列程序能够正确执行的是()。

A.
int a[10];
int sum=0;
for(int i=0;i<=10;i++) {
sum=sum+a[i];
}
B.
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];
}
C.
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];
}
D.
int a[10]={0};
int sum=0;
for(int i=0;i<=10;i++) {
  sum=sum+a[i];
}

正确答案C

解析详情
答案 C数组下标越界
思路与推导
  1. 在 C++ 中,`int a[10]` 的合法索引范围是 0 到 9。选项 A、B、D 的循环条件均为 `i <= 10`,当 i=10 时访问 `a[10]` 属于下标越界。选项 C 循环条件 `i < 10` 能够正确访问到所有 10 个元素且不越界。

第 13 题(单选题,2 分)

下面的程序中,会输出()。

int a[10]={1,2,3,4,5,6,7,8,9,10};
cout<<a[10]<<endl;
A.
1
B.
0
C.
10
D.
不确定的值

正确答案D

解析详情
答案 D未定义行为、数组越界访问
思路与推导
  1. 定义 `int a[10]` 后,合法的最大下标是 9。代码中试图输出 `a[10]`,属于非法越界访问内存。在 C++ 中,这种行为不会报编译错误,但会读取该内存位置上的随机垃圾数据,输出是不确定的。

第 14 题(单选题,2 分)

有ABCD4个人,其中一个是小偷,每个人说一句话,只有小偷说的是假话,其中A说:不是我。B说:是 C。C说:是D。D说:C瞎说,请问谁是小偷()。

A.
A
B.
B
C.
C
D.
D

正确答案C

解析详情
答案 C逻辑推理
思路与推导
  1. 采用假设法:若 C 是小偷,则 A、B 说的是真话(不是 A,是 C),C 说的是假话(是 D),D 说的是真话(C 瞎说)。这符合“只有小偷说假话”且只有一人是小偷的条件。若假设其他人是小偷,均会导致至少两句假话或逻辑冲突。

第 15 题(单选题,2 分)

下列程序输出的是()

string str = "Hello,CHAD";
cout << str.find("A") << '\n';
A.
9
B.
8
C.
7
D.
6

正确答案B

解析详情
答案 B字符串查找(find)
思路与推导
  1. 字符串索引从 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)计算的结果是-2。()

正确答案正确

解析详情
答案 正确原码运算缺陷
思路与推导
  1. 在 8 位原码下,[+1]原=0000 0001,[-1]原=1000 0001。相加得 1000 0010。该结果按原码解析即为 -2。这正体现了原码在进行正负数混合加法时的逻辑缺陷(符号位未参与有效进位处理)。

第 2 题(判断题,2 分)

~1的输出值是-2。()

正确答案正确

解析详情
答案 正确按位取反、补码运算
思路与推导
  1. 1 的补码是 00...01。按位取反后变为 11...10。在补码体系中,最高位为 1 表示负数,对该补码求原码:减 1 得 11...01,取反(符号位除外)得 10...10,对应十进制 -2。

第 3 题(判断题,2 分)

~1 = 1111 1110。()

正确答案正确

解析详情
答案 正确位运算(取反)
思路与推导
  1. 假设在 8 位环境下,数值 1 的二进制为 0000 0001。执行按位取反(~)后,每一位 0 变 1,1 变 0,结果为 1111 1110。断言正确。

第 4 题(判断题,2 分)

取X的低四位,可以用Y = 0000 1111,用X&Y获取X的低四位。

正确答案正确

解析详情
答案 正确位运算应用(掩码提取)
思路与推导
  1. 按位与(&)运算的特性是:x & 1 = x, x & 0 = 0。通过构造低四位全为 1 的掩码 0000 1111,可以使 X 的高位清零而保留低四位。这是常用的位提取操作。

第 5 题(判断题,2 分)

下列程序输出的是 A。()

char x = 65;
x++;
cout << x++ << endl;

正确答案错误

解析详情
答案 错误字符编码、后置自增运算
思路与推导
  1. 1. `x=65` 是字符 'A';2. `x++` 后 x 变为 66,即 'B';3. `cout << x++` 是后置自增,先输出当前值 'B' 再加 1。因此屏幕实际输出的是 B,断言错误。

第 6 题(判断题,2 分)

下列程序输出的是 3。()

string str="CHADai";
size_t pos = str.find('D');
cout<<pos<<endl;

正确答案正确

解析详情
答案 正确字符串查找(find)
思路与推导
  1. 在 "CHADai" 中,字符 'C' 索引 0,'H' 索引 1,'A' 索引 2,'D' 索引 3。`find` 函数返回该字符第一次出现的索引值 3。断言正确。

第 7 题(判断题,2 分)

下列程序将输出 1。()

int a[10]={1};
cout<<a[1]<<endl;

正确答案错误

解析详情
答案 错误数组部分初始化规则
思路与推导
  1. 在 C++ 中,`int a[10]={1}` 只将第一个元素 a[0] 初始化为 1,其余元素(包括 a[1])会自动初始化为 0。因此输出为 0,断言错误。

第 8 题(判断题,2 分)

下列程序将输出 A。()

int a=65;
cout<<(char)a<<endl;

正确答案正确

解析详情
答案 正确强制类型转换、ASCII 码
思路与推导
  1. ASCII 码中,65 对应大写字母 'A'。程序将整型 a 强转为字符型输出,结果为 A。断言正确。

第 9 题(判断题,2 分)

16进制数 AB,表示成2进制数是 10101011。()

正确答案正确

解析详情
答案 正确十六进制转二进制
思路与推导
  1. 十六进制 A 为 10,对应二进制 1010;十六进制 B 为 11,对应二进制 1011。拼合即为 10101011。断言正确。

第 10 题(判断题,2 分)

def (十六进制) = 103231 (五进制)。()

正确答案错误

解析详情
答案 错误多进制转换计算
思路与推导
  1. 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),故断言错误。