执行下面程序后,输出结果是( )。
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;
}看到结构体定义先想成员访问,看到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&),再判断是改副本还是改原对象。