GESP 四级 · GESP202609 C++ 四级 第 6 题

选择题 · 答案 D

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

题目

执行下面程序后,输出结果是(  )。

struct Device {
int id;
int state;
};
void reset(Device d) {
d.state = 0;
}
void start(Device &d) {
d.state += 1;
}
int main() {
Device d{7, 2};
reset(d);
start(d);
cout << d.id << " " << d.state;
return 0;
}
答案:D

解题思维

看到结构体定义先想成员访问,看到reset/start两个函数参数类型差异立刻定位考点——值传递只改副本,引用传递改原对象。main里先reset再start,关键是d.state在reset里被重置为0,但那是副本;start里d.state+=1,此时d.state是2,加1变3。

常见错误

选项A把reset当成引用传递,以为d.state被清零;选项B只看到start的+1,忽略reset是值传递不影响原对象;选项C误以为reset没执行或没生效。最阴险的是reset(d)参数是Device而非Device&,学生容易凭直觉认为"重置状态"就是改原对象。

详细解析(节选)

考纲定位

本题考查《GESP 考试大纲》四级"函数与过程"模块中值传递与引用传递的区别。命题人专门设计这道题卡住绝大多数考生的一个致命弱点:看到函数参数类型就凭直觉判断效果,不细看传递方式。四级考生往往能写出正确代码,但一到选择题就混淆值传递和引用传递的语义差异。

解题思维

看到题目先定位三个关键点: 1. Device d{7, 2}——d.id=7,d.state=2 2. reset(Device d)——参数是值传递,函数内修改的是副本 3. start(Device &d)——参数是引用传递,函数内修改的是原对象

数值推演:

这类题的通法是:遇到函数调用,先圈出参数类型(T vs T&),再判断是改副本还是改原对象。

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