C++ 竞赛入门

函数参数

函数参数

本节学会什么

  • 区分实参、形参和返回值
  • 用值传递把数据交给函数计算
  • 判断函数调用后原变量是否会改变

为什么需要它

函数名说明“做什么”,参数说明“需要什么数据”,返回值说明“得到什么结果”。先把这三件事写清楚,主程序就不用知道每一步计算的细节。默认情况下,函数获得的是实参的副本,这也是下一页理解引用参数的起点。

最小可运行示例

下面函数计算两数之差的绝对值。xy 是形参;调用时传入的 ab 是实参:

#include <iostream>

int absolute_difference(int x, int y) {
    int difference = x - y;
    if (difference < 0) {
        difference = -difference;
    }
    return difference;
}

int main() {
    int a = 3;
    int b = 8;
    int answer = absolute_difference(a, b);
    std::cout << answer << '\n';
    return 0;
}

输出是 5。调用结束后,a 仍然是 3b 仍然是 8;函数改的是自己的形参和局部变量,计算结果通过 return 交给调用者。

关键过程与易错点

  • 调用 absolute_difference(a, b) 时,形参 xy 各得到一份值。形参的名字不必与实参相同。
  • return value; 结束函数并把一个结果交回去。非 void 函数的每条可达路径都应返回正确类型的值。
  • void 函数没有返回值,适合只输出或执行动作的场景;需要计算结果时不要把答案只打印在函数内部。
  • 值传递意味着 void add_one(int x) { x += 1; } 不会改变调用者变量。下一页会学习什么时候用引用参数改变原变量。
  • 参数顺序是接口的一部分。absolute_difference(a, b) 中第一个实参传给第一个形参;顺序复杂时应使用清晰命名,而不是依靠记忆。

动手检查

编写 int larger(int a, int b),返回较大的数。分别测试相等、前者更大和后者更大三种输入。

再写 void add_one(int x),在函数中给 x 加一,然后在 main 中输出原变量。确认它没有变化,并写一句话解释变化发生在副本上。这正是下一页要解决的问题。

立即练习

难度 题目 题解 训练目标
基础 洛谷 P5735:距离函数 题解 设计参数和返回值,让函数只完成距离计算。
巩固 洛谷 P5737:闰年展示 题解 将可重复的判断封装为 bool 函数。