题目
小杨想通过下面程序给饭卡充值,程序会输出 $70$。
void recharge(int money) {
money += 20;
}
int main() {
int card = 50;
recharge(card);
cout << card;
return 0;
}
答案:B
考点
函数
解题思维
在纸上逐行模拟程序执行,重点追踪变量值变化和输出语句。按照题目输入代入计算。正确答案B。
常见错误
关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。
详细解析(节选)
【考点】函数参数传递(值传递)|变量作用域(局部变量 vs 全局变量)|程序执行流程(顺序执行)
1. 🎯 考纲定位
- GESP 四级 C++ "函数与过程"模块,卡住多数考生对"参数传递机制"的理解盲区,把值传递误当成引用传递
- 四级 C++ 重点考查基础语法与简单逻辑,此题专测参数传递这一高频考点
2. 🧠 解题思维
- 看到题先想:C++ 函数默认值传递,
recharge(card) 只会复制 card 的值给局部变量 money,函数内 +=20 只影响这个局部副本 - 关键观察:main 里
card 从未被赋值,cout << card 输出的是原始值 50,不是函数返回的 70 - 这一类题通法:遇到函数调用,先看清参数声明类型(值/引用/指针),再看函数内是否修改了参数,最后看调用处是否使用了被修改的变量
- 若误以为函数能改原变量,就会把输出当成 70,直接选 A
3. 🪤 陷阱拆解
- 选项 A 正确:命题人利用"把值传递当成引用传递"的常见误区,让你以为函数能改原变量
- 题目最阴险细节:
recharge(card) 看起来像修改 card,但 C++ 里是值传递,money 只是局部副本 - 只背结论"函数不能改原变量"会掉坑,必须理解参数传递机制
- 命题人专挑"看似修改实则未修"的表象,利用考生对 C++ 函数参数默认值传递的模糊认识
4. 🔄 反命题思维
- 改题示例:把
recharge(card) 改成 recharge(int &money),card 就被修改了,输出变 70,A 正确 - 若把 card 改成全局变量,同样能修,输出变 70,A 正确
- 一句话提醒:刷到类似题时,先问自己"命题人想考我什么"——是值传递还是引用传递?是作用域还是全局变量?是执行顺序还是变量生命周期?
同考点真题
- 第 25 题· GESP 二级样题(C++ 组) · 答案 B看解析 →
- 第 9 题· GESP 三级样题(C++ 组) · 答案 D看解析 →
- 第 3 题· GESP 四级样题(C++ 组) · 答案 D看解析 →
- 第 13 题· GESP 四级样题(C++ 组) · 答案 B看解析 →
- 第 24 题· GESP 四级样题(C++ 组) · 答案 B看解析 →