GESP 三级 · GESP202609 C++ 三级 第 19 题

判断题 · 答案 B

← 整套速查表 GESP 三级 全部真题

题目

这段代码执行后,能够将数组中所有大于 0 的元素赋值为 0 。

int a[] = {2, -5, 7, 0, -1};
int n = sizeof(a) / sizeof(a[0]);
for (int num : a) {
if (num > 0) {
num = 0;
}
}
答案:B

解题思维

范围for循环的循环变量是值拷贝而非引用。看到for (int num : a)先想"num是局部变量",每次迭代num只保存当前元素副本。关键观察:num = 0修改的是临时变量,原数组a[0]~a[4]仍保持初始值。数值推演:第一轮num=2>0执行num=0,但a[0]仍是2;第二轮num=-5不满足条件;第三轮num=7>0执行num=0,a[2]仍为7;第四轮num=0不满足;第五轮num=-1不满足。最终数组未变。这类题通法:范围for循环中直接赋值循环变量永远无效,必须用下标a[i]=0或引用int&num。

常见错误

选项A看似正确,命题人利用"赋值操作有效"的直觉陷阱。最阴险细节是循环变量声明为int num而非int& num,前者是值拷贝后者才是引用。许多考生误以为循环变量会反向修改原数组,这是典型的"作用域混淆"。

详细解析(节选)

这段代码无法实现目标。范围for循环的循环变量是值拷贝而非引用。看到for (int num : a)先想"num是局部变量",每次迭代num只保存当前元素副本。关键观察:num = 0修改的是临时变量,原数组a[0]~a[4]仍保持初始值。数值推演:第一轮num=2>0执行num=0,但a[0]仍是2;第二轮num=-5不满足条件;第三轮num=7>0执行num=0,a[2]仍为7;第四轮num=0不满足;第五轮num=-1不满足。最终数组未变。这类题通法:范围for循环中直接赋值循环变量永远无效,必须用下标a[i]=0或引用int&num。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断