这段代码执行后,能够将数组中所有大于 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;
}
}范围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。