GESP认证C++编程真题解析 | 202603 三级
附上汇总帖:GESP认证C++编程真题解析 | 汇总
单选题
第1题
如果字符变量 _1 的值是字符 1 ,那么 (int)_1 的值是?( )。
A. 1
B. -1
C. 49
D. +1 或者 -1
【答案】:C
【解析】
在C++中,字符类型 char 在内存中是以 ASCII 码的整数形式存储的。字符'1'对应的标准ASCII码值为49。当使用(int)对其进行强制类型转换时,得到的是其底层存储的数值,即49。因此选项C正确。
第2题
a,b是整型变量,各自有互不相同的初始值。下列程序实现了什么效果( )。
a=a^b;
b=a^b;
a=a^b;
A. a,b 的值从始至终都没有改变。
B. a,b 的值实现了互换。
C. a,b 的值互换了以后,又还回去了,相当于没有变化。
D. a,b 的值最后和原值不一样,没有任何意义。
【答案】:B
【解析】
这是利用异或运算交换两个变量值的经典算法。第一步a=ab;第二步b=ab相当于b=(ab)^b= a(bb) = a0=a,此时b变成了原a的值;第三步a=ab相当于a=(ab)a=b(aa)=b^0=b,此时a变成了原b的值。经过三次异或,最终实现了a和b值的互换。选项B正确。
第3题
关于下列正确的程序段,说法正确的是( )。
char str1[] = "Hello";
char str2[] ={'H','e','l','l','0'};
A. 字符数组 str1 和 str2 完全相同。
B.
cout<<str1<<endl;
cout<<str2<<endl;
这段程序多次执行将输出不同的结果。
C. 字符数组 str1 和 str2 不相等。
D. 这两个赋值方式完全相同。
【答案】:C
【解析】
str1是由字符串字面量初始化,编译器会在末尾自动添加隐藏的结束符'\0',实际长度为6。而str2是通过字符初始化列表赋值,元素分别为'H','e','l','l','0',注意最后一个元素是字符'0'而非结束符'\0',并且没有自动补充结束符。因为长度和内容都不一致,两数组不相等,故选项C说法正确。由于str2没有结束符,输出时可能产生乱码,结果也不同,并且一个含'o',一个含'0'结果也不一致,所以B选项也对。
第4题
关于以下程序段,说法正确的是( )。
int x=10;
cout<<(x++) + (++x)<<endl;
A. C++11 标准中,这是未定义行为,不同的环境有可能出现不同的结果
B. 22
C. 21
D. 20
【答案】:A
【解析】
这种写法在C++里属于未定义行为,不同环境情况下,理论上确实可能会出现不同结果,大家不要模仿。
第5题
8 位二进制下,十进制数-15 的补码是( )。
A. 11110000
B. 10001111
C. 10010000
D. 11110001
【答案】:D
【解析】
求负数的补码分三步:首先写出其8位二进制原码,-15的原码为10001111;然后除符号位外,将原码按位取反得到反码,即11110000;最后将反码末位加1,得到补码11110001。故选项D正确。
第6题
三进制数 转换成十进制是:( )。
A. 63
B. 65
C. 67
D. 69
【答案】:B
【解析】
将三进制数 \(2102_{(3)}\) 按权展开相加转换为十进制:\(2×3^3+1×3^2+0×3^1+2×3^0=2×27+1×9+0+2=54+9+2=65\)。因此选项B正确。
第7题
二进制数 10110101 是某数的 8 位补码,该数的十进制是( )。
A. -73
B. -75
C. -77
D. 75
【答案】:B
【解析】
最高位为1,说明该数为负数。已知补码为10110101,求原码可以将其减1得到反码10110100,再除符号位外按位取反得到原码11001011。或者对该补码直接再取一次补码(取反后加1):按位取反得11001010,加1得到11001011,其值为64+8+2+1=75。加上负号得出该数为-75,故选B。
第8题
已知 unsigned char c = 0x0F; (十六进制 0F = 二进制 00001111 ),执行 c = c << 3;后,c 的 十进制值是:( )。
A. 64
B. 72
C. 80
D. 120
【答案】:D
【解析】
无符号字符变量c的初始值为十六进制0x0F,即二进制的00001111。执行左移3位操作c<<3后,二进制位整体向左移动3位,低位补0,结果变为二进制的 01111000。将其转换为十进制为 \(2^6+2^5+2^4+2^3=64+32+16+8=120\)。故选项D正确。
第9题
补码的情况下,关于按位取反运算,用笔计算的情况下,以下说法错误的是:( )
A. ~5 的结果是 -6( int 类型,32 位)
B. ~0 的结果是 0( int 类型,32 位)
C. ~(-3)的结果是 2( int 类型,32 位)
D. ~8 的结果是 -9( int 类型,32 位)
【答案】:B
【解析】
在计算机的补码表示体系中,按位取反操作x等价于数学上的-(x+1)。由此可以快速计算:5=-(5+1)=-6;(-3)=-(-3+1)=2;8=-(8+1)=-9。而对于0,~0=-(0+1)=-1。选项B称结果为0是错误的,故本题选B。
第10题
执行以下 C++ 代码后,sub 的值是( )。
string str = "GESP2026";
string sub = str.substr(4, 2);
A. 20
B. 02
C. 2026
D. 026
【答案】:A
【解析】
C++标准库中字符串提取函数 substr(pos, count)的作用是从给定索引 pos 开始截取最多count个字符组成子串。字符串"GESP2026"索引从0开始编号,索引4处对应的字符是'2'。从此位置开始截取长度为2的子串,得到的是"20"。故选项A正确。
第11题
执行以下代码后,输出结果是:( )。
int arr[] = {5, 10, 15, 20, 25, 30};
int count = sizeof(arr) / sizeof(arr[0]);
cout << count;
A. 4
B. 6
C. 24
D. 30
【答案】:B
【解析】
代码中arr数组被初始化列表赋予了6个整型元素。sizeof(arr)用于求取整个数组在内存中占用的总字节数,而 sizeof(arr[0])用于求取数组单个元素占用的字节数。两者相除 sizeof(arr)/ sizeof(arr[0])是C++中求静态数组元素个数的标准做法。结果即为数组长度6。故选B。
第12题
执行以下代码后,输出结果是:( )。
char s[10] = "abcde";
int a = sizeof(s) / sizeof(s[0]);
int b = strlen(s);
cout << a - b;
A. 4
B. 5
C. 6
D. 10
【答案】:B
【解析】
char s[10]="abcde";定义并初始化了一个长度为10的字符数组,故整个数组占用10个字节,单个字符占1字节,a = sizeof(s) / sizeof(s[0])的结果为10。strlen(s)用于计算字符串的实际长度,它遇到结束符 '\0' 停止计数,不包含结束符,"abcde"实际长度为5,故b为5。输出a-b的值为10-5=5。选B。
第13题
以下问题中,最不适合用枚举法解决的是:( )
A. 找出 1~100 之间所有能被 7 整除的数
B. 找出 100~200 之间的所有质数
C. 计算 1+2+3+…+1000 的和
D. 找出三位数中个位、十位、百位数字之和等于 10 的数
【答案】:C
【解析】
枚举法(穷举法)的核心思想是系统地遍历所有可能的情况,通过条件判断寻找符合要求的问题解。选项A、B、D均属于在一个明确的空间内筛选出符合特定特征的数据,是枚举法的经典应用场景。而选项C属于等差数列求和,最佳解法是直接使用求和公式 \(S = \displaystyle\frac{n(a_1+a_n)}{2}\),或使用累加循环去模拟,不属于"筛选求可能解"的枚举范畴,最不适合枚举法。故选C。
第14题
用枚举法解决 “鸡兔同笼问题:头共 35 个,脚共 94 只,求鸡和兔的数量”,以下枚举逻辑最合理的是:( )
A. 枚举鸡的数量 x (0~35),兔的数量 y=35-x ,判断 2*x + 4*y == 94
B. 枚举兔的数量 y (0~94),鸡的数量 x=35-y ,判断 2*x + 4*y == 94
C. 枚举所有整数 x (0-100)和 y (0-100),判断 x+y==35 && 2*x+4*y==94
D. 枚举脚的总数 sum (0~94),判断 sum == 94
【答案】:A
【解析】
在使用枚举法解决问题时,应尽量缩小解的枚举空间以提高效率。对于鸡兔同笼,已知头共35个,因此只需要一层循环枚举鸡的数量x(范围0到35)。此时兔子的数量y必定是35-x。只需验证限制条件—―脚的数量方程2 * x + 4 * y == 94即可。选项B兔的数量范围过大;选项C采用了双重循环遍历,产生大量无效尝试,效率低下;选项D逻辑本身就是错误的。故选A。
第15题
模拟 “字符串加密”:规则为 “每个字符 ASCII 码 + 3,若超过 z (122)则从 a 重新开始”,以下代码中正确 的条件判断是:( )
for (int i = 0; i < str.length(); i++) {
// 需补充条件:
_______________________
else {
str[i] += 3;
}
}
A. if (str[i]> 122) str[i] = str[i] + 3 - 26;
B. if (str[i] > 122) str[i] = str[i] - 26;
C. if (str[i] + 3 > 122) str[i] = str[i] - 26;
D. if (str[i] + 3 > 'z') str[i] = 'a' + (str[i] + 3 - 'z') - 1;
【答案】:D
【解析】
按照加密规则,对于每一个字符,如果加3后的ASCII 码超过了小写字母z的边界(即122),需要折返循环。因此,判定条件应该是对加3后的值进行判定:str[i]+3>'z'。当发生越界时,超出边界的量为 str[i] + 3-'z',需要从 'a' 重新开始累加,对应公式为 'a'+超出量-1。只有选项 D 的逻辑与题意中的模拟过程完全一致。选项A和B的判断条件均未包含+3,会导致判断失效。若无意外,C和D是等价的,都对。
判断题
第1题
定义 int arr[5] = {1,2,3}; ,则 arr[3] 的值为 0,arr[5] 是合法下标。
第2题
定义 double arr[10]; ,未手动初始化时,数组中所有元素的默认值为 0.0。
第3题
定义 int arr[] = {1,2,3}; ,则 sizeof(arr)的结果为 12( int 占 4 字节)。
第4题
下面的流程图是用来求 1+2+3+…+10 的和。
请判断:这个流程图的逻辑正确还是错误?

第5题
下面流程图的功能是计算 5 对 2 取余数,输出结果为 1。

第7题
已知大写字符 A 的ASCII编码的十六进制表示为 0x41 ,计算字符 m 的ASCII编码的八进制表示为 155 (八进制)。
第8题
在 C++ 位运算中,各种不同的运算符有优先级的区分,使用括号能够解决优先级的问题。
第9题
由于在 0~255 范围内,char 类型和 int 类型可以互换,因此在这里 x 和 y 相等。
char x='1';
int y=1;
第10题
在C++语言中,表达式((0xf0 + 0x15) == 255)的值为 true。
第26题
如果 a 为 int 类型的变量,且 a 的二进制最低位为 0 ,则表达式((a & 3 & 1) == 0)的值为 true。
浙公网安备 33010602011771号