执行下述代码,将输出( )。
void swap(int a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 1, y = 2;
swap(x, y);
std::cout << x << y;
return 0;
}答案D。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】值传递|引用传递|函数参数机制
🎯 考纲定位:本题考查 GESP 四级 C++ 大纲中"函数参数传递"核心考点,命题人卡住绝大多数考生的弱点——死记 swap 能交换变量,却未理解值传递和引用传递的本质差异。
🧠 解题思维:先看 swap 函数定义,第一个参数 int a 是值传递,第二个参数 int &b 是引用传递。调用 swap(x, y) 时,x 的值被拷贝到局部变量 a,y 的引用被绑定到 b。函数内 a 和 b 的变化不影响 x,但 b 是 y 的引用,所以 y 被修改。main 中 x 保持 1,y 变成 1,输出 11。这一类题的通法是:逐参数检查传递方式,区分值传递和引用传递,追踪变量变化。
🪤 陷阱拆解:A 和 B 是交换后结果,命题人利用考生误以为 a 也是引用传递;C 是 y 不变,利用考生忽略 b 的引用性质;D 是正确答案。最阴险细节是 swap 函数中 a 和 b 传递方式不同,考生容易混淆。如果你只背结论、不理解本质,就会掉进这个陷阱。
🔄 反命题思维:若将 swap 改为两个引用传递,x 和 y 都会交换,输出 21;若改为两个值传递,x 和 y 都不变,输出 12。刷到类似题时,先问自己"命题人想考我什么",是考参数传递方式,还是考函数内部逻辑。