判断题:C++ 数组的下标从 0 开始。
考点:下标从 0 开始(A1)。
解析:C++ 数组下标从 开始:int a[5] 的下标是 ,a[0] 是第一个元素。✅ 正确
排除法:无(判断题)。混淆点:a[5] 是第 6 个元素(越界)——"第 1 个元素"对应下标 0,与人类习惯不同。
关联 · 越界(H1):下标从 0 是越界错误的根源——
a[n]访问的是第 n+1 个元素。
int a[5] = {1, 2, 3}; 执行后,a[3] 的值是( )。
考点:数组初始化(A2)。
解析:int a[5] = {1, 2, 3}; 前 3 个元素依次为 1、2、3,未列出的元素自动补 0:a[3] = 0、a[4] = 0。✅ A
排除法:B 是 a[2];C 不确定是局部变量未初始化的情形(见第 4 章 B2),列表初始化会补 0;D 合法不会报错。
关联 · 局部变量(第 4 章 B2):
int a[5];(无初始化)在函数内是垃圾值;int a[5] = {...};未列出的补 0——初始化方式决定内容。
判断题:访问数组越界元素(如 int a[5]; 中的 a[5])不会报错,但结果是未定义行为。
考点:越界访问(A3)。
解析:C++ 不做数组边界检查:a[5](大小 5 的数组)编译不报错、运行也不一定报错,但读到/写到相邻内存——未定义行为(可能崩溃、可能静默出错)。✅ 正确
排除法:无(判断题)。混淆点:Python 会抛 IndexError、C++ 不会——"不报错"不等于"安全"。
关联 · 下标从 0(A1):
a[n]越界一格;i <= n的循环是最常见的越界来源(见 H3)。
记忆点:C++ 越界 = 定时炸弹——不响是运气,不是正确。
int a[10]; 中,sizeof(a) / sizeof(a[0]) 的值是( )。
考点:数组长度(A4)。
解析:sizeof(a) = 整个数组的字节数();sizeof(a[0]) = 一个元素的字节数();相除得元素个数 。✅ A
排除法:B 是总字节数;C 是单个元素;D 无来源。
关联 · sizeof(第 4 章 B5):
sizeof在定义处可用(知道数组大小);数组传进函数后退化为指针,sizeof只剩指针大小(见第 4 章 F5)。
int a[5] = {1, 2, 3, 4, 5}; 用循环求所有元素之和,结果是( )。
考点:遍历求和(A5)。
解析:sum += a[i] 循环 :。✅ A
排除法:B 是 (漏最后);C 是 (多算);D 是元素个数。
关联 · 前缀和(C2):频繁求区间和时用前缀和把 降到 。
验算: ✓
把 个元素的数组完全逆序存放,最少需要交换( )次。
考点:数组逆序(A6)。
解析:逆序 = 首尾交换:swap(a[0], a[4])、swap(a[1], a[3]),中间元素 不动——5 个元素共 次。✅ A
排除法:B 次是 6 个元素();C/D 多于需要。
关联 · 交换(第 2 章 D6):交换可以用临时变量或异或;n 个元素逆序需要 次交换。
记忆点:逆序交换次数 = 元素数整除 2。
在 个元素的数组中找最大值,一般需要( )次比较。
考点:找最值(A7)。
解析:先假设 a[0] 是最大值,然后从 a[1] 开始逐个比较:共比较 次。✅ A
排除法:B 次是连自己也比较;C 无来源;D 是误以为可以两两比较。
关联 · 桶计数(C1):找最值 、桶计数 ——数组的基本操作都是线性扫描。
判断题:int a[3][4]; 表示一个 行 列的二维数组。
考点:二维数组定义(B1)。
解析:int a[3][4]; 第一个下标是行(3 行)、第二个是列(4 列)——先写行后写列。✅ 正确
排除法:无(判断题)。混淆点:写成"4 行 3 列"就把行列弄反了(见 H2);读作"a 三行四列"。
关联 · 行优先(B3):内存里按行连续存放:第一行 4 个、第二行 4 个……
int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; 中 a[1][2] 的值是( )。
考点:二维初始化(B2)。
解析:{{1,2,3},{4,5,6}} 按行给值:第 0 行 1,2,3、第 1 行 4,5,6。a[1][2] = 第 1 行第 2 列 = 。✅ A
排除法:B 是 a[1][1];C 是 a[0][2];D 是 a[0][1]。
关联 · 双重循环(B4):
for i for j读a[i][j]——外循环行、内循环列。
判断题:C++ 二维数组按行优先存储(先存完第一行,再存第二行)。
考点:行优先存储(B3)。
解析:C/C++ 二维数组行优先存储:第 0 行全部存完才存第 1 行,内存中是连续的一维序列。✅ 正确
排除法:无(判断题)。混淆点:Fortran 等语言是列优先;C++ 是行优先——a[i][j] 的地址 = 首地址 + (i×列数+j)×元素大小(见 B7)。
关联 · 一维映射(B7):行优先的直接推论:
a[i][j]是第 i×列数+j 个元素。
遍历 int a[3][4]; 的全部元素,需要( )层循环。
考点:双重循环遍历(B4)。
解析:二维数组需要两层循环:外层遍历行、内层遍历列。✅ A
排除法:B 一层只能扫一行;C 三维数组才要 3 层;D 与列数无关。
关联 · 遍历求和(A5):一维一层、二维两层——维度决定循环层数。
int a[3][4]; 占用( )字节(int 占 字节)。
考点:二维数组内存(B5)。
解析:元素总数 个,每个 int 4 字节: 字节。✅ B
排除法:A 是元素个数;C 是 ;D 是按 8 字节。
关联 · 数组内存(第 3 章 B6):
int a[100][100]= 字节 ≈ 40 KB——行列相乘再乘类型大小。
的数组 a 中,主对角线上的元素是( )。
考点:主对角线(B6)。
解析:主对角线 = 行号等于列号的元素:a[0][0]、a[1][1]、…、a[4][4],即 a[i][i]。✅ A
排除法:B a[i][0] 是第一列;C a[0][i] 是第一行;D a[i][4-i] 是副对角线。
关联 · 二维遍历(B4):对角线只遍历行号一个变量——
for (i = 0; i < 5; i++)访问a[i][i]。
记忆点:主对角a[i][i]、副对角a[i][n-1-i]——两条对角线是高频考点。
按行优先存储的 int a[3][4]; 中,a[2][3] 是从 0 开始数的第( )个元素。
考点:一维映射(B7)。
解析:行优先下,a[i][j] 前面有 i 整行(每行 4 个)+ 本行前 j 个 = 个:a[2][3] = 。✅ A
排除法:B 是把它当第 12 个(从 1 数);C/D 行列混算。
关联 · 行优先(B3):公式
a[i][j]下标 = ——列数乘在行号上,别乘反。
验算: ✓
统计一组数字中 各出现的次数,计数数组应定义大小为( )。
考点:桶计数(C1)。
解析:统计 需要下标 共 个位置:cnt[d]++(d 是数字)。✅ A
排除法:B 会漏掉数字 9(下标 0~8);C 更少;D 浪费。
关联 · 字母频次(G1):统计 26 个小写字母用大小 26 的数组,
cnt[ch - 'a']++——"数值范围决定数组大小"。
前缀和数组 s[i] 表示 a[0] + ... + a[i],则 a[l] + ... + a[r] 等于( )。
考点:前缀和(C2)。
解析:s[r] 含 a[0]~a[r],s[l-1] 含 a[0]~a[l-1],相减恰好剩 a[l]~a[r]。✅ A
排除法:B s[r]-s[l] 少了 a[l];C 相加不对;D 方向反。
关联 · 遍历求和(A5):单次求和 ;前缀和预处理 后每次区间和 ——查询多次时必备。
验算:a = {1,2,3,4,5},s = {1,3,6,10,15};a[2]+a[3]=s[3]-s[1]= ✓
判断题:bool 数组常用来做标记(如 visited),记录某个元素是否被访问过。
考点:标记数组(C3)。
解析:bool visited[n] = {false}; 记录"是否访问过"——DFS/BFS、去重、筛法都要用。✅ 正确
排除法:无(判断题)。混淆点:标记数组的下标就是"被标记的对象"(元素值/编号),值为 true/false。
关联 · 桶计数(C1):计数数组记"次数"、标记数组记"是否"——一个统计一个布尔。
判断题:逆序输出数组元素,只需从下标 循环到 ,不需要真的交换元素。
考点:逆序输出(C4)。
解析:只输出不改数组:for (i = n-1; i >= 0; i--) cout << a[i]——不需要交换。✅ 正确
排除法:无(判断题)。混淆点:逆序输出(读)与逆序存放(写,见 A6)是两回事——前者 遍历即可,后者要交换。
关联 · 逆序存放(A6):改数组才交换;只看不改成倒着遍历。
判断题:在数组中删除一个元素后,需要把它后面的元素依次前移一位。
考点:删除元素(C5)。
解析:数组连续存放,删掉 a[k] 后,a[k+1] 及之后的所有元素都要前移一位,末尾元素重复(或忽略)。✅ 正确
排除法:无(判断题)。混淆点:删除是 操作(最坏移动 n 个)——频繁插入删除用链表(第 7 章)。
关联 · 插入(C5 对称):插入要后移;删除要前移——数组中间增删都慢。
判断题:对已排序的数组去重,只需比较相邻元素是否相同。
考点:有序去重(C6)。
解析:已排序数组中相同元素必相邻:遍历时若 a[i] != a[i-1] 就保留(或记录),一趟完成。✅ 正确
排除法:无(判断题)。混淆点:无序数组不能只比相邻(相同元素不相邻)——先排序再去重是经典组合。
关联 · 桶计数(C1):去重也可以桶标记;有序数组用相邻比较最省。
判断题:char s[10]; 最多可以存放 个字符(要留 个位置给结尾的 '\0')。
考点:字符数组大小(D1)。
解析:C 字符串以 '\0' 结尾,char s[10] 最后一个位置要留给结束符,最多存 个字符。✅ 正确
排除法:无(判断题)。混淆点:char s[10] 存 "abc" 只用前 4 格(a b c \0),其余未用——"最多 9 个"是上限不是必须。
关联 · 结束标志(D4):
'\0'是字符串的"句号"——没有它,strlen会一直数到内存里的下一个 0。
判断题:字符串字面量(如 "abc")是常量,不能修改它的内容。
考点:字符串字面量(D2)。
解析:"abc" 是 const char[4] 类型的字面量,内容在只读区——s[0] = 'x' 修改它是未定义行为(常崩溃)。✅ 正确
排除法:无(判断题)。混淆点:char s[] = "abc"; 会复制一份到可写的数组(可修改);char *p = "abc"; 指向只读字面量(不可修改)——两种写法大不同。
关联 · 字符数组(D1):要修改内容就用
char s[]数组;只读使用才用指针指字面量。
char s[] = "abc"; 则 strlen(s) 与 sizeof(s) 的值分别是( )。
考点:strlen 与 sizeof(D3)。
解析:strlen 运行时数到 '\0' 为止:"abc" 长度 (不含结束符);sizeof 编译期算数组总大小:char s[] = "abc" 占 4 字节(含 '\0')。✅ A
排除法:B 4 和 3 弄反;C 都 3 漏了结束符;D 都 4 把 strlen 也算上结束符。
关联 · 字符串结尾(第 3 章 F5):
sizeof("abc")= 4(含'\0')、strlen("abc")= 3(不含)——一个是"存储占多少",一个是"内容有多长"。
判断题:遍历字符数组可以用 while (s[i] != '\0'),'\0' 是字符串的结束标志。
考点:结束标志(D4)。
解析:C 字符串以 '\0'(ASCII 0)结尾:while (s[i] != '\0') 逐字符处理,遇 '\0' 停。✅ 正确
排除法:无(判断题)。混淆点:'\0' 是一个字符(值为 0),不是空字符串 ""(那是长度为 0 的字符串,也以 '\0' 结尾)。
关联 · 字符数组(D1):遍历依赖结束标志——忘记写
'\0'的字符数组无法确定边界。
C 风格字符串比较是否相等,应使用( )。
考点:strcmp(D5)。
解析:C 风格字符串是数组,s1 == s2 比较的是地址(永远不等,除非同一数组)——必须用 strcmp(s1, s2) == 0 判断相等(返回 0 表示相等)。✅ A
排除法:B == 比较地址;C strcpy 是复制;D strlen 是长度。
关联 · string 比较(F3):
string直接用==/<(运算符重载);C 字符串必须strcmp——两种字符串两种比较法。
判断题:cin >> s 遇到空格会停止读取,而 getline(cin, s) 会读取整行(含空格)。
考点:cin 与 getline(D6)。
解析:cin >> s 按空白(空格/换行)分隔,读到空格就停;getline(cin, s) 读一整行(含空格,到换行为止)。✅ 正确
排除法:无(判断题)。混淆点:getline 只对 string 用;cin >> s 读 "I love" 只得到 "I"(见 G4 的坑)。
关联 · 读取整行(H4):含空格的输入必须
getline;cin >>后混用getline要注意残留换行。
判断题:C++ 中字符串比较(如 "abc" < "abd")按字典序逐字符比较。
考点:字典序(D7)。
解析:字符串比较从左到右逐字符按 ASCII 码比,第一个不同的字符决定大小:"abc" < "abd"(c < d);前缀相等时短的更小("ab" < "abc")。✅ 正确
排除法:无(判断题)。混淆点:不是按长度比——"b" > "aaaa"(b 的 ASCII 大)。
关联 · strcmp(D5):
strcmp按字典序返回负/0/正;string的<同理。
char c = '7'; int d = c - '0'; 执行后,d 的值是( )。
考点:数字字符转数字(E1)。
解析:数字字符的 ASCII 码连续:'0' = 48、'7' = 55,'7' - '0' = 。✅ A
排除法:B 是 '7' 的 ASCII 码(忘了减);C 无来源;D 字符相减合法。
关联 · 字母序号(E4):同一思想:
ch - 'a'得到 0~25 的字母下标、ch - '0'得到数字值。
记忆点:字符转数字 = 减'0'。
判断题:小写字母 'a' 与大写字母 'A' 的 ASCII 码相差 。
考点:大小写差 32(E2)。
解析:'A' = 65、'a' = 97,相差 :'a' - 'A' = 32。✅ 正确
排除法:无(判断题)。混淆点:不是 26(那是字母个数)——ASCII 表里大小写之间隔着 32(含 6 个符号 + 26 个字母)。
关联 · 大小写切换(第 2 章 D10):
ch ^ 32一键切换大小写(只翻第 5 位);ch ± 32是算术法。
记忆点:65 A / 97 a / 差 32;大写化ch - 32、小写化ch + 32。
判断题:isdigit(c) 用于判断字符 c 是否为数字字符('0' 到 '9')。
考点:字符分类(E3)。
解析:<cctype> 提供分类函数:isdigit(c) 判断数字、isalpha(c) 判断字母、islower/isupper 判断大小写。✅ 正确
排除法:无(判断题)。混淆点:这些函数返回非 0 表示"是"(不一定是 1);c >= '0' && c <= '9' 是手写等价。
关联 · 数字字符(E1):分类 + 转换组合:先
isdigit再c - '0'是标准套路。
字符 'C' 在英文字母表中的序号是( )(从 开始数)。
考点:字母序号(E4)。
解析:'C' - 'A' + 1 = ——A 是第 1 个、B 第 2 个、C 第 3 个。✅ A
排除法:B 是按 0 开始数(C 是下标 2);C 是 ASCII 码本身;D 无来源。
关联 · 字母频次(G1):
ch - 'a'得 0~25 下标、ch - 'A' + 1得 1~26 序号——"减基字符"是万能公式。
验算: ✓
判断题:把字符串 "123" 转成整数 ,可以逐位处理:123 = 1 \times 100 + 2 \times 10 + 3。
考点:字符串转整数(E5)。
解析:逐位累乘:"123" → 1 → 1×10+2=12 → 12×10+3=123;即 。✅ 正确
排除法:无(判断题)。混淆点:"123" + 0 不是数字(字符串不能直接转);stoi("123") 是现成函数(C++11)。
关联 · 数字字符(E1):每步
num = num * 10 + (s[i] - '0')——转数字的核心循环。
判断题:把整数逐位取出(用 % 10 取个位、/ 10 去掉个位)可以构造它的字符串形式。
考点:整数转字符串(E6)。
解析:% 10 取个位、/ 10 去掉个位,循环直到 0——得到的是逆序的数字位,需要再反转。✅ 正确
排除法:无(判断题)。混淆点:123 → 3, 2, 1 的顺序——先取到的是个位,最后要 reverse;to_string(123) 是现成函数。
关联 · 字符串转整数(E5):互逆操作:
×10+digit转进、%10 /10转出。
判断题:string s = "abc"; 与 string s("abc"); 等价。
考点:string 定义(F1)。
解析:string s = "abc"; 与 string s("abc"); 都是拷贝初始化/直接初始化,结果相同。✅ 正确
排除法:无(判断题)。混淆点:string s; 默认是空字符串(不是垃圾值)——类类型有构造函数保证初始状态。
关联 · 字符数组(D1):
string自动管理'\0'和内存,比char[]安全——初赛阅读题默认用string。
string a = "ab", b = "cd"; string c = a + b; 执行后,c 的值是( )。
考点:string 拼接(F2)。
解析:+ 拼接两个 string:"ab" + "cd" = "abcd";+= 追加到自身。✅ A
排除法:B/C 是只取了其中一个;D 合法不会编译错误。
关联 · 拼接复杂度:
a + b产生新字符串 ;循环里s += c反复追加可能多次扩容(通常可接受)。
判断题:string 类型可以直接用 == 和 < 比较(按字典序)。
考点:string 比较(F3)。
解析:string 重载了 ==、<、> 等:按字典序逐字符比较(同 D7),返回 bool。✅ 正确
排除法:无(判断题)。混淆点:C 风格字符串 s1 == s2 比地址(见 D5)——string 直接比内容,这是两者的关键区别。
关联 · strcmp(D5):
string用==、C 字符串用strcmp——"现代写法 vs 老写法"。
string s = "abcdef"; 则 s.substr(1, 3) 的值是( )。
考点:substr(F4)。
解析:s.substr(pos, len) 从下标 pos 起取 len 个字符:"abcdef" 从 1 起取 3 个 = "bcd"。✅ A
排除法:B "abc" 是从 0 取 3;C "bce" 无来源;D "bcde" 是从 1 取 4。
关联 · 字符串处理(G 组):
substr+find是字符串切片的黄金组合。
验算:下标 1 是'b',取 3 个:b c d ✓
string s = "hello"; 则 s.find("ll") 的返回值是( )。
考点:find(F5)。
解析:s.find("ll") 返回子串首次出现的起始下标:"hello" 中 "ll" 从下标 2 开始。✅ A
排除法:B 是第二个 l 的位置;C 无来源;D 是找不到时的返回值(npos)。
关联 · substr(F4):
find找位置、substr切片段;find返回string::npos(即 -1)表示未找到——判断要写!= npos。
判断题:C++11 起可以用 for (char c : s) 遍历 string 中的每个字符。
考点:范围 for(F6)。
解析:C++11 起 for (char c : s) 逐个取出 s 的字符——只读副本;要修改写 for (char &c : s)。✅ 正确
排除法:无(判断题)。混淆点:for (char c : s) 中 c 是拷贝,改 c 不影响 s;s[i] 下标访问才是可写的。
关联 · 遍历(A5):一维数组/string 都能范围 for——比下标更不易越界(见 H3)。
判断题:s.c_str() 返回 C 风格字符串(const char*),用于与 C 语言函数兼容。
考点:c_str(F7)。
解析:s.c_str() 返回 const char*(以 '\0' 结尾的 C 字符串),用于调用 C 风格函数(如 strlen、printf)。✅ 正确
排除法:无(判断题)。混淆点:返回的是 const 指针(不能修改);且只在下一次修改 s 前有效。
关联 · 字符数组(D1):
string↔char[]互转:c_str()出、string(s.c_str())入。
统计一段文本中 个小写字母各出现的次数,计数数组应定义大小为( )。
考点:字母频次(G1)。
解析:26 个小写字母对应下标 :cnt[ch - 'a']++——数组大小 26。✅ A
排除法:B 漏掉 'z'(下标 25);C 是大小写都统计;D 是 ASCII 全集。
关联 · 桶计数(C1):数字 0~9 用 10、小写字母用 26——"值域多大数组多大"。
记忆点:ch - 'a'把字母映射到 0~25(见 E4)。
判断题:判断长度为 的字符串是否回文,可以比较 s[i] 与 s[n - 1 - i]。
考点:回文判断(G2)。
解析:回文 = 正读反读相同:比较 s[i] 与 s[n-1-i](首尾对称),全等即回文。✅ 正确
排除法:无(判断题)。混淆点:只需比较前一半(i < n/2)——后一半是对称重复的,比完即可。
关联 · 逆序(A6):
s[n-1-i]是对称位置——"首尾夹逼"是回文/逆序的通用下标技巧。
string s = "abc"; 反转后得到的字符串是( )。
考点:反转字符串(G3)。
解析:反转 = 首尾交换直到中间:"abc" → swap(a[0], a[2]) → "cba"。✅ A
排除法:B 原串;C "bac" 是只换前两个;D "cab" 是循环移位。
关联 · 数组逆序(A6):string 反转与数组逆序同一套路;
reverse(s.begin(), s.end())是现成函数。
字符串 "I love CSP" 按空格分隔,共有( )个单词。
考点:按空格数单词(G4)。
解析:"I love CSP" 被空格分成 3 段:I、love、CSP——3 个单词。✅ A
排除法:B 是连空格一起数(I+空格+love+空格+CSP);C/D 无来源。
关联 · cin 与 getline(D6):
cin >> s正好按空格切单词;getline拿整行再切——数单词要小心连续/首尾空格(通常按"非空格且前一个是空格"计数)。
判断题:删除字符串中所有指定字符,需要把要保留的字符依次前移。
考点:删除指定字符(G5)。
解析:遍历时把要保留的字符写到"新位置"(双指针思想):s[k++] = s[i]——保留的字符依次前移,跳过要删的。✅ 正确
排除法:无(判断题)。混淆点:原地删除不能边删边用原下标——用"写入指针"技术(一个读指针 i、一个写指针 k)。
关联 · 数组删除(C5):数组/字符串删除的本质都是"前移覆盖",。
判断题:int a[5]; 中合法的下标范围是 ,a[5] 是越界访问。
考点:越界下标(H1)。
解析:int a[5] 合法下标 :a[5] 是第 6 个元素的位置,越界(未定义行为,见 A3)。✅ 正确
排除法:无(判断题)。混淆点:a[5] 恰好是"数组后面的第一个地址"——可能"碰巧能用",但那是运气。
关联 · 下标从 0(A1):
a[5]越界是因为下标 0 起、到 4 止——"第 5 个元素"是a[4]。
判断题:int a[3][4]; 中,a[4][3] 是合法访问( 行 列)。
考点:二维下标写反(H2)。
解析:int a[3][4] 行下标 、列下标 :a[4][3] 行下标 4 越界(且逻辑上也不存在第 4 行)。✅ 错误
排除法:无(判断题)。混淆点:先写行后写列——a[3][4] 里 3 是行数上限、4 是列数上限,下标分别是 0~2 和 0~3。
关联 · 二维定义(B1):合法访问
a[i][j]要求 、。
判断题:遍历 int a[n]; 时写 for (int i = 0; i <= n; i++) 会越界访问一次。
考点:遍历越界(H3)。
解析:i <= n 会让 i 取到 ——访问 a[n] 越界一次;正确写法 i < n。✅ 正确
排除法:无(判断题)。混淆点:i <= n-1 等价 i < n;含端点的直觉(<=)在数组遍历里是错误源头(见第 4 章 D7)。
关联 · 循环边界(第 4 章 D7):数组遍历用
i < n;"1 到 n"的输出场景才用<=——先想清下标范围。
要读取含空格的整行字符串,应使用( )。
考点:读取整行(H4)。
解析:getline(cin, s) 读取整行(含空格,遇换行停)——读含空格的字符串必须用它。✅ A
排除法:B cin >> s 遇空格停;C scanf("%s") 同样遇空白停;D cin.get() 只读一个字符。
关联 · cin 与 getline(D6):
cin >> x后接getline会读到残留换行——中间通常要cin.ignore()或先getline再解析。
下列说法错误的是( )。
考点:综合判断(H5)。
解析:D 错误——数组下标从 0 开始(见 A1),这是本题要抓的陷阱。✅ D
排除法:A string 支持 + 拼接(F2);B char 数组要留 '\0' 的位置(D1);C strlen 不含 '\0'(D3)——A/B/C 都正确,所以"错误"的是 D。
关联 · 本章串联:A(string 拼接 F2)、B(字符数组 D1)、C(strlen D3)、D(下标 A1)——综合题 = 细节判断的集合。