函数定义与参数传递
函数定义与参数传递
函数定义与调用、形参与实参;传值参数与传引用参数;常量与变量的作用范围。
概念
函数把一段逻辑命名复用:定义时写形参列表与函数体,调用时实参按规则绑定到形参。传值拷贝一份,改形参不影响实参;传引用 T& 形参是实参别名,可带回修改;传指针类似但通过地址间接访问。变量作用域分局部(块内)与全局(文件内),同名局部遮蔽外层。与 cspj.cpp.recursion 的区别:本叶子考定义、调用与参数机制,递归考函数调用自身与边界。阅读程序常给 swap、读入函数、返回多个结果的小函数,问某次调用后实参是否改变。
CSP-J 常考
cspj-r1-2025第 10 题:单选题,考查函数定义、调用或参数传递概念。cspj-r1-2021第 20 题:阅读程序判断,跟踪带参数的函数调用后变量值。cspj-r1-2024第 39 题:完善程序空位,补与函数参数或返回值相关的语句。
void add_one(int &x) { ++x; } // 引用:修改实参
int sq(int x) { return x * x; } // 传值:只读副本
int main() {
int n = 3;
add_one(n);
cout << n << " " << sq(n) << endl; // 4 16
}
易错点
- 传值函数内
x = y不会交换调用方的变量,除非用引用或指针。 - 完善程序若函数形参是
int &,调用处必须传左值,不能传字面量或临时表达式的「地址感」选项。 - 阅读程序里全局变量与局部同名时,函数内无声明的标识符指向局部,逐行推值时先确认当前作用域。
阅读程序共 1.5 分1 道小题
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
原卷作答说明:判断题正确填 √,错误填 ×
程序
1
#include <iostream>2using namespace std;34int n;5int a[1000];67int f(int x)8{9 int ret = 0;10 for (; x; x &= x - 1) ret++;11 return ret;12}1314int g(int x)15{16 return x & -x;17}1819int main()20{21 cin >> n;22 for (int i = 0; i < n; i++) cin >> a[i];23 for (int i = 0; i < n; i++)24 cout << f(a[i]) + g(a[i]) << ' ';25 cout << endl;26 return 0;27}- 20判断1.5 分
将源代码中
g函数的定义(14∼17 行)移到 main 函数的后面,程序可以正常编译运行。( )
完善程序共 3 分1 道小题
整组作答后提交批改,成绩计入掌握度 · 已答 0/1
(汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
- 只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。
- 每次只能移动一个圆盘。
- 小圆盘必须始终在大圆盘之上。
试补全程序。
#include <iostream>
#include <vector>
using namespace std;
void move(char src, char tgt) {
cout << "从柱子" << src << "挪到柱子" << tgt << endl;
}
void dfs(int i, char src, char tmp, char tgt) {
if (i == ___①___) {
move(___②___);
return;
}
dfs(i - 1, ___③___);
move(src, tgt);
dfs(___⑤___, ___④___);
}
int main() {
int n;
cin >> n;
dfs(n, 'A', 'B', 'C');
}
程序
1
#include <iostream>2#include <vector>3using namespace std;45void move(char src, char tgt) {6 cout << "从柱子" << src << "挪到柱子" << tgt << endl;7}89void dfs(int i, char src, char tmp, char tgt) {10 if (i == ___①___) {11 move(___②___);12 return;13 }14 dfs(i - 1, ___③___);15 move(src, tgt);16 dfs(___⑤___, ___④___);17}1819int main() {20 int n;21 cin >> n;22 dfs(n, 'A', 'B', 'C');23}- 39(②)单选空位 ②3 分
② 处应填( )
考虑以下 C++ 函数:
void solve(int &a, int b) {
a = a + b;
b = a - b;
a = a - b;
}
int main() {
int x = 5, y = 10;
solve(x, y);
}
在 main 函数调用 solve 后,x 和 y 的值分别是?