return——让函数不只是“做事”,还能“给出答案”。
先学 return 的基本语法,再对比“只打印”和“真正返回”两种写法的差别,
接着看返回值怎么参与后续运算,最后掌握两个容易出错的地方:
提前 return 和每条路径都要有返回值。
return——让函数不只是“做事”,还能“给出答案”。
先学 return 的基本语法,再对比“只打印”和“真正返回”两种写法的差别,
接着看返回值怎么参与后续运算,最后掌握两个容易出错的地方:
提前 return 和每条路径都要有返回值。
上节课写的 printSum(int a, int b) 只能自己在函数里 cout
打印结果。如果我们想拿这个和继续做别的事——比如再乘以 2,或者
和另一个值比较——现在的写法能做到吗?
#include <iostream>
void printSum(int a, int b) {
std::cout << a << " + " << b << " = " << (a + b) << std::endl;
}
int main() {
printSum(3, 4);
// 只能看到打印出来的 "3 + 4 = 7"
// 这个 7 没办法存起来、也没办法拿去做别的运算
return 0;
} void 函数就像一个只会“喊出答案”、却不肯把答案交给你的同学。
我们需要的是:函数算完之后,把结果交回调用它的地方,
让 main 可以把这个结果存起来、继续使用——这就是返回值的作用。
| 部分 | 例子 | 含义 |
|---|---|---|
| 返回类型 | int | 这个函数会返回一个 int 值 |
| return 语句 | return sum; | 把 sum 的值交回调用的地方 |
返回类型不再写 void,而是写具体类型——int、double、
bool、std::string 都可以。return 一执行,
函数立刻结束,把值交还给调用它的地方。
#include <iostream>
int add(int a, int b) {
int sum = a + b;
return sum;
}
int main() {
int result = add(3, 4);
std::cout << result << std::endl;
return 0;
} main 结尾的 return 0; 其实就是
main 把一个 int 返回给操作系统——
只是当时没细讲。今天是第一次自己写返回类型不是 void 的函数。
照着 add.cpp 的样子,自己写一个 int subtract(int a, int b),
返回 a - b。运行前先猜 subtract(10, 3) 的结果,再验证。
把上面的 printSum 改成有返回值的版本,对比一下能做的事情多了多少:
#include <iostream>
int sum(int a, int b) {
return a + b;
}
int main() {
int result = sum(3, 4);
int doubled = result * 2; // 返回值存进变量,可以继续参与运算
std::cout << "和:" << result << std::endl;
std::cout << "和的两倍:" << doubled << std::endl;
std::cout << "还能直接用:" << sum(10, 20) << std::endl; // 不存变量也行
return 0;
} result 是一个普通的 int 变量,跟其他变量没有任何区别——
可以拿去乘、加、比较,也可以直接嵌进 cout 里,
而上面的 printSum 只能把结果打印出来,调用处不能把这个计算结果当作值继续使用。
square(3) 这个调用表达式,取值就是 return 后面的值——
可以赋给变量,也能直接嵌进更大的表达式里,甚至嵌套调用自己。
#include <iostream>
int square(int n) {
return n * n;
}
int main() {
int a = square(3);
int b = square(4);
int c = square(a) + square(b); // 返回值可以直接参与运算
std::cout << c << std::endl;
return 0;
} Python:不用声明返回类型
def square(n):
return n * n
C++:必须写明返回类型
int square(int n) {
return n * n;
}
运行 square_chain.cpp 前,先手算 a、b、c
分别是多少,写在纸上,再运行对答案。
第 7 讲在 main 里用过“提前 return”——校验不通过就直接结束,
后面的代码不再执行。这个技巧在自定义函数里同样适用:
bool isValidScore(int score) {
if (score < 0 || score > 100) {
return false; // 不合法,函数立刻结束,下面的代码不执行
}
return true;
} return,编译器通常会警告,但不一定拒绝编译。
一旦程序沿着这条路径执行到函数末尾,就会产生未定义行为:程序的行为没有保证,
不能使用这个结果。
int absValue(int n) {
if (n < 0) {
return -n;
}
// n >= 0 的情况忘了写 return,这条路径没有返回值
}
把 missing_return.cpp 补成完整程序,给 n >= 0
的情况也补上 return,让每条路径都有返回值。
absValue,确认结果正确。if / else 两个分支,只用一条语句写出绝对值?
写一个 int square(int n),返回 n 的平方。
在 main 里对 1 到 5 分别调用并输出结果。
写一个 double celsiusToFahrenheit(double c),返回摄氏度 c
换算成华氏度的结果(公式:华氏 = 摄氏 × 9 / 5 + 32)。
提示:函数体只需要一行 return,把公式直接写在
return 后面即可,不用先声明中间变量。
写一个 double average(double a, double b, double c),返回三个数的平均值。
在 main 里读入三科分数,调用它算出平均分,再用返回值判断“是否及格”
(>= 60)。
写一个 bool isPrime(int n),返回 n 是否为质数。
提示:把第 9 讲练习里判断质数的思路搬过来——这次不直接
cout,而是用 return true / return false
把结论交出去。
| 能力 | 用到的工具 |
|---|---|
| 声明函数的返回类型 | int / double / bool 函数名(参数) |
| 把值交回调用处 | return 值; |
| 让返回值参与后续计算 | 函数调用当表达式用 |
| 避免路径缺少返回值 | 检查每个分支都有 return |
main
只负责读输入、选运算、调用函数、输出结果——函数版计算器。