执行下面程序后会输出 20 。
void change(int x) {
x = 20;
}
int main() {
int x = 10;
change(x);
cout << x;
return 0;
}看到函数形参是 int 类型且无引用符号,立刻意识到是值传递。main 里的 x 和 change 里的 x 是两个独立变量,函数内修改形参不影响实参。输出的是 main 中的 x,所以结果仍是 10。这类题核心是区分值传递与引用传递,形参名相同只是巧合,作用域不同。
选项 A 是典型陷阱,利用形参与实参同名制造"修改成功"的假象。学生容易忽略值传递的本质,误以为函数内对 x 的赋值会同步到 main 中。命题人故意用相同变量名诱导思维惯性,考察对作用域隔离的理解。
本题考查 GESP 四级大纲中"函数与参数"模块的核心概念——值传递。命题人将这道题放在四级试卷,是因为它精准卡住了绝大多数考生对作用域隔离的盲区:看到形参与实参同名,本能地认为"修改了参数就是修改了变量",却忽略了 C++ 中参数默认是值传递,形参只是实参的副本。
解题的关键在于追踪变量生命周期。main 函数中 x 初始化为 10,调用 change(x) 时,实参 x 的值 10 被复制给形参 x。在 change 函数内部执行 x = 20,只是修改了形参这个局部副本,main 中的 x 完全不受影响。返回 main 后,cout << x 输出的是原始值 10。
这类题的通法是:遇到函数调用,先判断参数传递方式(值传递还是引用传递),再确认作用域隔离——形参名相同只是巧合,真正决定变量是否被修改的是它们在内存中的独立性。