小杨在做数学题,题目要求找出从 $1$ 到 $35$ 中能被 $7$ 整除的数字,即 $[7, 14, 21, 28, 35]$,则横线处应填入哪个代码?( )
#include <iostream>
using namespace std;
int main() {
int arr[35];
int count = 0;
for (int i = 1; i <= 35; i++) {
if (i % 7 == 0)
________________ // 在此处填入代码
}
for (int i = 0; i < count; i++)
cout << arr[i] << endl;
return 0;
}答案A。位运算代码补全要注意区分位运算符(&|^)和逻辑运算符(&&||)。异或(^)常用于交换值。
位运算代码补全容易出错,因为位运算结果不如算术运算直观。记住异或的自反性。
【考点】数组索引与计数器配合|循环控制|变量作用域
1. 🎯 考纲定位 GESP 三级「编程基础」模块明确要求掌握数组的线性存储特性与下标访问。这道题精准卡住考生对「数组下标从 0 开始」与「计数变量自增时机」两个底层概念的混淆——三级考生普遍能写出循环和条件判断,但一旦涉及动态数组填充,就暴露出对「计数器作为下标」这一核心机制的缺失,这是从二级到三级跨越的最大坎。
2. 🧠 解题思维 看到题先识别数据结构需求:需要顺序存储多个结果,经典方案是「动态数组 + 计数器」。关键观察是两个变量在 if 块内的状态:i 是遍历值(1..35),count 是已填元素个数(0..5)。推理链条:第一次命中时 count=0,必须把 i 存入 arr[0] 然后 count 变 1;第二次命中时 count=1,必须把 i 存入 arr[1] 然后 count 变 2。因此核心操作是「用 count 做下标、存入 i、然后自增 count」。通法:所有「收集满足条件数据」的题型,必须用 arr[count++] = value 这种原子式操作,用后置自增确保下标指向当前位置而非下一位。
3. 🪤 陷阱拆解 选项 B 把 i 当数组下标(最大 35 越界),count 当存储值(逻辑全错);选项 C 同样越界且 count 未自增(后续输出崩溃);选项 D 看似正确实则存的是 count 而非 i(数组全填 0-4)。命题人利用的误区:一是误以为遍历变量 i 可直接当索引(混淆遍历值与存储位置),二是忽略后置自增的副作用(以为 arr[count] = count++ 等于存入 i 再增加)。如果你只背「数组要 count++」却不理解「下标必须用 count、存入必须用 i」,就会掉进 D 这种半对半错陷阱。
4. 🔄 反命题思维 若把条件改为「统计个数」,则只需 count++ 无需数组;若改为「反向输出」,则需先填完再倒序遍历;若改为「只存前 3 个」,则需加 && count < 3。一句话提醒:刷到类似题先问自己「命题人想考我什么」,如果考数组动态计数,核心就是 arr[count++] 这个原子操作,任何把 i 当索引、把 count 当值的变体都是错误答案。