C++函数的调用与返回值
困难42函数调用与返回值:让代码“跑”起来
函数就像你收藏的一个“积木块”,平时放在那里不动。只有当你在程序中调用它时,它才会开始工作。调用函数时,你还可以给它一些“材料”(参数),它做完事情后可能会把结果返回给你,就像按计算器:你输入数字(参数),它算出答案(返回值)显示在屏幕上。
下面我们一起来看看函数是怎么被“叫醒”的,以及返回值到底是怎么回事。
1. 什么是函数调用?—— 就像请朋友帮忙
函数定义好之后,不会自动执行。你需要“喊”它的名字,并告诉它需要哪些具体的数据。例如,你已经定义了一个计算两数之和的函数:
int add(int a, int b) { // a, b 是两个加数
return a + b; // 返回它们的和
}
调用它的写法是:add(3, 5)。这就像你对朋友说:“帮我算一下 3 加 5 等于多少?” 朋友算出 8 后,就把这个结果告诉你。程序也是这样:
int result = add(3, 5); // 调用 add 函数,用 3 和 5 做参数,结果存到 result
这里的 add(3, 5) 就是函数调用。3 和 5 叫做实际参数(实参),它们会传给函数定义中的 a 和 b。
生活例子:你有一台自动售货机(函数),你投币并按下按钮(调用),机器收到指令后输出一瓶可乐(返回值)。
2. 返回值是什么?—— 函数做完事给你的答案
函数用 return 语句把结果送回来。这个结果可以:
- 存到变量里,以后反复使用;
- 直接用在表达式里,比如
cout输出。
例子1:存到变量
int sum = add(10, 20); // sum 得到 30
cout << "和是:" << sum << endl; // 输出 "和是:30"
例子2:直接输出
cout << add(5, 7) << endl; // 输出 12
这里 add(5, 7) 返回 12,然后 cout 直接把它打印出来。
生活例子:你让同桌帮你算一道数学题,他算完后把答案写在纸上还给你。这张纸上的数字就是返回值。
3. 有返回值的函数 vs. 无返回值的函数
有些函数只是完成某个动作,不需要返回结果。例如,只打印一行文字的“打招呼”函数,它的返回类型是 void,意思就是“什么都没有”。
void sayHello() {
cout << "你好!" << endl;
}
调用它时,不能把它当成一个值来用:
sayHello(); // 正确,直接执行
// int x = sayHello(); // 错误!因为 sayHello 没有返回值
而像 add 这样的有返回值函数,如果你不接收它的结果,它也会计算出值,但没人用这个值,通常会被浪费掉。不过语法上是允许的:
add(2, 3); // 合法,但返回的 5 没有被使用
两种函数的区别:
| 函数类型 | 定义时返回类型 | 调用时是否能接收结果 | 生活中类比 |
|---|---|---|---|
| 有返回值 | int double 等 | 可以存到变量或用表达式里 | 按计算器得到数字 |
| 无返回值 | void | 不能接收,只能单独一行 | 按灯泡开关,灯亮但没数字 |
4. 新手常见错误
错误1:调用有返回值的函数时,忘记处理返回值
add(3, 5); // 计算结果被丢弃,没有意义
虽然不报错,但代码浪费了。建议总是把返回值用在有意义的地方。
错误2:对 void 函数使用赋值或输出
string msg = sayHello(); // 错误!void 函数没有返回值可以赋值
cout << sayHello(); // 错误!同样道理
错误3:函数定义时忘记写 return
int subtract(int a, int b) {
// 忘记写 return a - b;
}
这样调用时,返回值是垃圾值,程序行为未知。编译器会警告,但可以运行,结果往往出错。
错误4:函数调用时参数个数或类型不匹配
int result = add(3); // 错误:需要两个参数
int result = add(3, 5.5); // 如果函数是 int add(int a, int b),double 会被截断成 int,可能丢失精度
5. 完整可运行程序:计算考试总分和平均分
下面这个程序定义了两个函数:一个计算总分,一个打印结果。注意每个变量定义都有中文注释。
#include <iostream>
using namespace std;
// 计算三个数的总和,返回整数
int sumScore(int s1, int s2, int s3) { // s1,s2,s3 是三科分数
return s1 + s2 + s3;
}
// 打印分数等级,无返回值
void printGrade(int total) { // total 是总分
if (total >= 270) {
cout << "优秀" << endl;
} else if (total >= 240) {
cout << "良好" << endl;
} else {
cout << "加油" << endl;
}
}
int main() {
int chinese = 85; // 语文成绩
int math = 92; // 数学成绩
int english = 88; // 英语成绩
int total = sumScore(chinese, math, english); // 调用,获得总分
cout << "总分:" << total << endl; // 输出总分
printGrade(total); // 调用无返回值函数,打印等级
return 0;
}
输出结果:
总分:265
良好
这个程序展示了两种调用方式:total = sumScore(...) 接收返回值,printGrade(total) 只是执行动作不看返回值。
6. 相关知识点指引
学会了函数调用和返回值,你还可以继续探索:
- 函数参数:参数的传值方式、默认参数等。
- 函数重载:同一个函数名可以处理不同类型的参数。
- 递归函数:函数调用自己,解决复杂问题(比如计算阶乘)。
- 局部变量与全局变量:函数内部定义的变量只在函数内有效。
记住:调用函数就像请朋友帮忙,你给朋友材料(参数),他做完后要么把结果(返回值)交给你,要么只做事情不说话。多加练习,你就能让“积木”组合出强大的程序!
例题精讲
以下关于C++函数返回值的说法,正确的是?
在C++中,函数调用时实参的求值顺序是由编译器决定的,程序员不能假设特定的求值顺序。
完成函数定义,使其返回两个整数中的最大值。
int max(int a, int b) {
return ___;
}以下关于函数原型声明的选项中,正确的是?
完成main函数中的语句,调用add函数计算3和4的和并输出。
int add(int x, int y);
int main() {
int a=3, b=4;
cout << ___;
}