GESP 客观题评测系统
2024-03-Level-4
2024-03-Level-4
试卷解析总览,可直接查看每题答案与解析。
第 1 题(单选题)
若函数声明为 int f(int &x){ x+=3; return x; }, 则对声明的变量 int a=3, 下面哪个调用能够改变 a 的值()。
正确答案C
解析详情
【答案】C
【考点】函数参数传递(引用传递)
【解析】 函数 f 的参数 x 是引用传递(int &x),在调用 f(a) 时,x 成为 a 的别名。函数内部执行 x+=3 即直接修改了实参 a 的值。选项 A 和 B 的语法与函数声明不匹配,选项 D 传递的是表达式计算后的临时值(右值),无法绑定到非 const 引用参数。
【易错点】 区分引用传递(修改实参)与值传递(不修改实参)的区别。
第 2 题(单选题)
下面C++代码执行后,输出的是()。
int main()
{
int x[] = {2, 0, 2, 4};
char geSP[] = "Grade Examination of SP";
cout << geSP[sizeof(x)] << endl;
cout << endl;
return 0;
}正确答案C
解析详情
【答案】C
【考点】sizeof 运算符与数组索引
【解析】 在 C++ 中,int 类型通常占用 4 字节,数组 x 有 4 个元素,因此 sizeof(x) 的值为 4 * 4 = 16。表达式 geSP[sizeof(x)] 即访问 geSP[16]。字符串 "Grade Examination of SP" 中,索引 0 为 'G',空格占一个位置,索引 16 对应的字符是 "Examination" 中的 'n'。
【易错点】 容易混淆 sizeof(返回字节数)和数组长度(元素个数)。
第 3 题(单选题)
下面C++代码执行后输出是()。
int foo(float *f)
{
return int(*f*2);
}
int main()
{
float fnum[10]={1.1};
fnum[1]=foo(fnum);
cout << fnum[0]+fnum[1] << endl;
cout << endl;
return 0;
}正确答案D
解析详情
【答案】D
【考点】指针、数组初始化与类型转换
【解析】 1. fnum[10]={1.1} 初始化第一个元素 fnum[0]=1.1,其余为 0。 2. foo(fnum) 传入数组首地址,*f 等于 fnum[0]=1.1。返回值为 int(1.1*2) = int(2.2) = 2。 3. 因此 fnum[1]=2。最后输出 fnum[0]+fnum[1] = 1.1 + 2 = 3.1。
【易错点】 注意 int 强制转换会截断小数部分而非四舍五入。
第 4 题(单选题)
对二维数组 int arr[3][16];则 arr[1] 占用内存的大小为()字节。
正确答案D
解析详情
【答案】D
【考点】多维数组内存布局与字节计算
【解析】 arr[3][16] 是一个二维数组,arr[1] 是其第二行,也是一个含 16 个 int 类型元素的一维数组。由于 1 个 int 类型通常占用 4 字节,故 arr[1] 占用的内存大小为 16 * 4 = 64 字节。
【易错点】 计算数组大小时需要将元素个数乘以单个元素的字节数(int 为 4 字节)。
第 5 题(单选题)
对二维数组 int arr[3][16];,若 arr 的地址是 0x28cbc0,则 arr[1] 的值是()。
正确答案C
解析详情
【答案】C
【考点】二维数组地址计算
【解析】 arr 为数组首地址。arr[1] 的值(即第二行的起始地址)等于 arr[0] 的地址加上第一行所占的字节数。第一行有 16 个 int,占用 16 * 4 = 64 字节。64 的十六进制为 0x40。0x28cbc0 + 0x40 = 0x28cc00。
【易错点】 地址偏移量的计算需注意进制转换(10进制的 64 转 16进制为 40)。
第 6 题(单选题)
下面C++代码执行后输出是()。
int main()
{
char *p="I love GESP!";
cout << p + 5 << endl;
cout << endl;
return 0;
}正确答案C
解析详情
【答案】C
【考点】字符指针运算与字符串输出
【解析】 指针 p 指向字符串常量 "I love GESP!" 的首地址。p+5 表示指针向后偏移 5 个字符。原串索引:0:I, 1:' ', 2:l, 3:o, 4:v, 5:e。因此 p+5 指向字符 'e',cout 输出指针时会输出从该位置开始直到结束的所有字符,即 "e GESP!"。
【易错点】 注意索引从 0 开始计数,空格也占用一个索引位置。
第 7 题(单选题)
下面C++代码执行以后输出的是()。
int rc=5;
int main()
{
int rc;
cout << ++rc << endl;
cout << endl;
return 0;
}正确答案D
解析详情
【答案】D
【考点】变量作用域与局部变量初始化
【解析】 在 main 函数内声明了局部变量 rc,它会屏蔽全局变量 rc=5。由于局部变量 rc 声明时没有初始化,其初始值是不确定的。执行 ++rc 时,对一个不确定的值进行自增,结果依然是不确定的。
【易错点】 误以为局部变量会自动初始化为 0,实际上只有全局变量和静态变量会自动初始化为 0。
第 8 题(单选题)
下面C++函数中采用的算法是()。
int fib(int n)
{
int i, f[n] = {0, 1};
for (int i = 2; i <= n; i++)
f[i] = f[i - 1] + f[i - 2];
return f[n];
}正确答案A
解析详情
【答案】A
【考点】递推算法
【解析】 该代码通过已知的初始值 f[0] 和 f[1],利用循环按照公式 f[i] = f[i-1] + f[i-2] 从前往后依次计算出每一项的值。这种从基础条件出发逐步推导出后续结果的思路是典型的递推算法。
【易错点】 区分递归(自顶向下,调用自身)与递推(自底向上,利用循环和数组)。
第 9 题(单选题)
插入排序在最好情况下的时间复杂度是()。
正确答案C
解析详情
【答案】C
【考点】插入排序的时间复杂度
【解析】 在最好情况下,即原始序列已经是有序的。此时每一轮插入操作都只需要与前一个元素进行一次比较即可确定位置,不需要移动元素。总共进行 N-1 次比较,因此时间复杂度为 O(N)。
【易错点】 需记住插入排序和冒泡排序在最好情况(已有序)下均为 O(N),而选择排序始终是 O(N^2)。
第 10 题(单选题)
在如下的C++代码执行后,设第11和12行的输出地址值分别为 X 和 Y,则下面正确的是()。
struct pass{
int no;
char name[20];
int level;
};
int main()
{
struct pass XiaoYang;
cout << "&XiaoYang=" << &XiaoYang << endl; //第11行
cout << "&(XiaoYang.no)=" << &(XiaoYang.no) << endl; //第12行
cout << endl;
return 0;
}正确答案B
解析详情
【答案】B
【考点】结构体内存布局
【解析】 在 C++ 中,结构体对象的首地址与其第一个成员变量的起始地址在数值上是相同的。&XiaoYang 是整个结构体对象的地址 X,&(XiaoYang.no) 是其第一个成员 no 的地址 Y。因此 X == Y。
【易错点】 容易认为结构体头部可能包含某种“描述符”而导致第一个成员地址靠后,实际上 C++ 结构体第一个成员通常对齐在起始处。
第 11 题(单选题)
如果文件 1.txt 中的内容如下,则执行下面C++代码时,注释了 #### 那行代码所输出的 x 的值为( )。
50 2024 3.16 I
love
GESP!int main()
{
ifstream fin;
string line;
int x;
fin.open("1.txt",ios::in);
for (int i=0; i<2; i++) {
fin >> line;
cout << line << endl;
}
fin>>x;
cout << x << endl; //###
cout << endl;
return 0;
}正确答案C
解析详情
【答案】C
【考点】文件输入流与类型匹配读取
【解析】 1. 循环执行两次 fin >> line,分别读取字符串 "50" 和 "2024"。 2. 接下来 fin >> x,此时输入流到达 "3.16"。由于 x 是 int 类型,提取操作会读取到小数点之前停止,因此读取到 3,小数点及其后的内容留在流中。输出 x 为 3。
【易错点】 注意 int 类型读取浮点数时会被截断读取(只读出整数部分),而不是读取失败或整体转为浮点数。
第 12 题(单选题)
执行下列 C++ 代码时输出中的第 2 行是()。
int main()
{
char *s[]={(char*)"2024",(char*)"3.16",(char*)"GESP"};
for (int i=0; i<2; i++)
{
cout << *s+i << endl;
}
cout << endl;
return 0;
}正确答案C
解析详情
【答案】C
【考点】指针运算与字符数组输出
【解析】 s 是一个字符指针数组。*s 等价于 s[0],即指向第一个字符串 "2024" 的指针。在循环中: 1. i=0 时,输出 *s+0,即 "2024"。 2. i=1 时,输出 *s+1,指针向后移动一位,指向 "024" 的首字母 '0',故输出 "024"。 因此第 2 行输出是 "024"。
【易错点】 容易混淆 *(s+i)(获取第 i 个字符串)和 *s+i(对第一个字符串进行指针偏移)。
第 13 题(单选题)
C++语言中下面哪个关键字能够限定对象的作用域()。
正确答案B
解析详情
【答案】B
【考点】C++ 关键字作用
【解析】 static 关键字有多种作用:修饰局部变量时延长其存储期;修饰全局变量或函数时,将其作用域限制在当前文件内(内部链接)。故它可以用来限定作用域。extern 用于声明外部链接,inline 用于建议内联,public 是访问控制修饰符。
【易错点】 注意 static 在不同上下文中的作用(生命周期 vs 作用域)。
第 14 题(单选题)
小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是()。
正确答案C
解析详情
【答案】C
【考点】计算机常识(操作系统)
【解析】 鸿蒙(HarmonyOS)是华为公司开发的一款分布式操作系统,旨在为不同设备的互联互通提供统一的平台。在智能手表上运行的是该系统的适配版本。
【易错点】 对国产技术名词的基本分类需了解。
第 15 题(单选题)
中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是()。
正确答案C
解析详情
【答案】C
【考点】计算机历史常识
【解析】 王选先生是中国著名计算机科学家,其最重大的贡献是研制成功汉字激光照排系统,使中国印刷业实现了“告别铅与火,迎来光与电”的技术变革。
【易错点】 应记住著名科学家的里程碑式成果。
判断题(每题 2 分)
第 1 题(判断题)
对 int a[]={2,0,2,4,3,1,6},执行第一趟选择排序处理后 a 中数据变为 {0,2,2,4,3,1,6}。()
正确答案正确
解析详情
【答案】正确
【考点】选择排序过程
【解析】 选择排序第一趟在全数组 [0, 6] 中寻找最小值。当前最小值为 0(索引为 1),将其与第一个元素 a[0]=2 交换,交换后数组变为 {0, 2, 2, 4, 3, 1, 6},描述正确。
【易错点】 注意选择排序是寻找最小值并与起始位交换,不要和冒泡排序混淆。
第 2 题(判断题)
如果待排序数据不能都装进内存,需要使用外排序算法。()
正确答案正确
解析详情
【答案】正确
【考点】外排序概念
【解析】 当数据量过大导致内存无法一次性容纳时,必须将数据存放在外部存储(如磁盘)中,通过多次内外存交换完成排序,这种方法称为外排序(如多路归并排序)。
【易错点】 需理解内存(内排序)与外存(外排序)的使用场景区别。
第 3 题(判断题)
定义变量 int a=5,则 cout << &++a 会输出 b。()
正确答案错误
解析详情
【答案】错误
【考点】取地址运算符与输出内容
【解析】 ++a 返回的是变量 a 递增后的左值,其地址可以用 & 运算符获取。但 cout << &++a 输出的是一个内存地址(通常是十六进制数值),而不是字符 'b'。
【易错点】 误以为地址输出会与字符映射相关,实际上地址输出的是物理存储位置。
第 4 题(判断题)
两个函数之间可以使用全局变量来传递数据。()
正确答案正确
解析详情
【答案】正确
【考点】全局变量的作用域与功能
【解析】 全局变量定义在函数外部,在整个程序生命周期内有效,所有函数都可以访问同一个全局变量,因此可以通过修改和读取全局变量的值来实现函数间的数据传递。
【易错点】 虽然全局变量可以传参,但过度使用会破坏程序的封装性和可维护性。
第 5 题(判断题)
定义数组 int a[2024][3][16]={2,0,2,4,3,1,6},则 cout << a[2023][2][15] 的结果不确定。()
正确答案错误
解析详情
【答案】错误
【考点】多维数组初始化规则
【解析】 在 C++ 中,如果对数组进行了部分初始化,则未提供初始值的元素会被自动初始化为 0。a[2023][2][15] 属于未明确赋初值的部分,因此其值被自动初始化为 0,是确定的。
【易错点】 容易混淆“不初始化(值随机)”和“部分初始化(其余填0)”的情况。
第 6 题(判断题)
在C++语言中,函数的参数为指针时,可以在函数内部修改该参数的值。()
正确答案错误
解析详情
【答案】错误
【考点】指针参数传递(值传递)
【解析】 当参数为指针时,传递的是“地址值”。在函数内部可以修改指针“指向的内容”,但修改“参数本身”(即使其指向另一个地址)只是改变了函数内的局部副本,不会影响调用处的实参指针。题干描述具有误导性。
【易错点】 混淆“修改指针指向的内容”和“修改指针变量本身的值”。
第 7 题(判断题)
在C++语言中 try 子句里抛出的结构体等类型的异常无法被 catch 捕获。()
正确答案错误
解析详情
【答案】错误
【考点】异常处理机制
【解析】 C++ 的异常处理机制非常灵活,可以抛出并捕获几乎任何类型的异常,包括基本数据类型(如 int, char)、结构体、类对象等。只要 catch 子句中声明了匹配的类型即可捕获。
【易错点】 不要误以为异常处理只能用于专门的异常类对象。
第 8 题(判断题)
C++语言中 cout << 9^2 << endl;会输出81。()
正确答案错误
解析详情
【答案】错误
【考点】按位异或运算符
【解析】 在 C++ 中,^ 是按位异或运算符,不是数学中的幂运算符。9(1001)异或 2(0010)的结果是 11(1011),因此会输出 11 而不是 81。
【易错点】 混淆 C++ 运算符与数学符号,计算幂应使用 pow 函数。
第 9 题(判断题)
小杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接入到WIFI盒子才能收看节目,那这个WIFI盒子具有路由器的功能。()
正确答案正确
解析详情
【答案】正确
【考点】网络设备基础常识
【解析】 WIFI 盒子(无线路由器)能够为终端设备分配 IP 地址并提供无线信号接入,其核心功能包括路由、转发和 DHCP 分配,具备路由器的基本功能,描述符合常识。
【易错点】 需理解家用网络设备的基本工作原理。
第 10 题(判断题)
任何一个 for 循环都可以转化为等价的 while 循环()。
正确答案正确
解析详情
【答案】正确
【考点】循环结构的转化
【解析】 for (初始化; 条件; 更新) {...} 结构可以完全等价地转换为:初始化; while(条件) {... 更新;}。在 C++ 中,for、while 和 do-while 三种循环结构在逻辑表达能力上是等价的。
【易错点】 注意 continue 语句在 for 循环中执行后会跳转到“更新”表达式,而在 while 中需手动确保更新逻辑被执行,否则可能导致死循环。