执行下面程序后,输出结果是( )。
int score = 60;
void update(int &score) {
score += 5;
}
int main() {
int score = 80;
update(score);
cout << score << " " << ::score;
return 0;
}全局变量 score 初始 60,main 中局部变量 score 初始 80 遮蔽了全局同名变量。update 函数通过引用参数修改传入的局部 score 变为 85,而 ::score 强制访问全局作用域仍为 60,因此输出 85 60。
B 项误以为全局变量被修改,混淆了引用参数作用对象;C 项同时认为全局变量被改,错在 ::score 的访问规则;D 项完全忽略引用传递,以为函数内修改不影响外部。
本题考查《GESP 考试大纲》四级 C++ 模块中的作用域规则与引用传递。命题人卡住的是绝大多数考生对全局变量遮蔽机制和引用参数作用对象的混淆——四级考生往往能写出正确的引用声明,但一到实际调用就分不清"引用的是谁"。
看到题先想:全局变量 score 初始 60;main 中又声明了局部 score 初始 80,局部遮蔽全局;update 函数通过引用参数接收 score,因此修改的是局部变量而非全局变量;::score 是全局作用域运算符,强制访问全局变量。
数值推演:main 中局部 score = 80,调用 update(score) 后局部 score 变为 85,全局 score 保持 60,输出 85 60。
这一类题的通法是:遇到同名变量,先画作用域树,从内向外检查遮蔽关系;遇到 :: 运算符,直接跳到全局作用域取值。