📘函数定义与调用

2026-08-26
⭐⭐ GESP 3级

📖概念讲解

函数是一段"打包好的代码",给它一组输入(参数),它帮你算出一个结果(返回值)。定义函数时要写清楚返回类型、函数名、参数列表,调用时传入实际的值(实参)。

核心规则:

💻代码示例

1#include <iostream>
2using namespace std;
3
4// 定义函数:求两数之和,返回 int
5int add(int a, int b) { // a, b 是形参(局部变量)
6 return a + b; // return 把结果送回调用处
7}
8
9// 定义函数:无返回值,只打印
10void printSquare(int n) { // void 表示不需要返回值
11 cout << n * n << endl; // 直接输出,不 return
12}
13
14int main() {
15 int x = add(3, 5); // 调用 add,实参 3 和 5 传给 a, b
16 cout << "3 + 5 = " << x << endl;
17 printSquare(4); // 调用无返回值函数
18 return 0;
19}
20// 输出: 3 + 5 = 8 然后换行 16

🧩互动小测

Q1:下面函数调用后,a 的值是多少?

Q2:下面代码的输出是什么?

int f(int n) { return n > 0 ? n + f(n-1) : 0; }
cout << f(4);

Q3:函数定义 double calc(int x, double y),下面哪个调用正确?

🏋️动手练一练

📝 编程练习

写一个函数 int gcd(int a, int b),用辗转相除法(欧几里得算法)求两个正整数的最大公约数。
然后在 main 中读入两个整数,调用 gcd 输出结果。
提示:辗转相除法:gcd(a, b) = gcd(b, a % b),当 b == 0 时 a 就是答案。
参考答案:
#include <iostream>
using namespace std;

int gcd(int a, int b) {
    if (b == 0) return a;   // 递归终止:b为0时a即GCD
    return gcd(b, a % b);   // 用余数缩小问题
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << gcd(a, b) << endl;
    return 0;
}
// 输入: 12 8  输出: 4

要点:递归写法最简洁,注意 base case 是 b==0 而不是 a==0。也支持写成 while 循环的非递归版本。

📝易错点提醒

⚠️ 返回值类型必须匹配
定义了 int 函数却 return 一个字符串,或定义了 void 却写了 return 值,都会报错。
⚠️ 函数声明顺序
如果函数 A 调用函数 B,B 必须在 A 之前定义,或者在前面加一行声明(原型):int B(int);
⚠️ 形参不影响实参
值传递时,形参只是实参的副本。函数里改了形参,外面的变量纹丝不动。想改外部变量要用引用传递(&)。
学完这个知识点后点一下