← 课程目录
第 12 讲 模块四:用函数组织代码

返回值

12 / 24
💡
本节课目标
学习 return——让函数不只是“做事”,还能“给出答案”。 先学 return 的基本语法,再对比“只打印”和“真正返回”两种写法的差别, 接着看返回值怎么参与后续运算,最后掌握两个容易出错的地方: 提前 return每条路径都要有返回值
开场

只会做事,还不够

📖 理论讲解

上节课的函数有个限制

上节课写的 printSum(int a, int b) 只能自己在函数里 cout 打印结果。如果我们想拿这个和继续做别的事——比如再乘以 2,或者 和另一个值比较——现在的写法能做到吗?

print_sum_void.cpp CPP
#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 可以把这个结果存起来、继续使用——这就是返回值的作用。

第一段

语法:把 void 换成真正的类型

📖 理论讲解

语法拆解

部分例子含义
返回类型int这个函数会返回一个 int
return 语句return sum;sum 的值交回调用的地方

返回类型不再写 void,而是写具体类型——intdoubleboolstd::string 都可以。return 一执行, 函数立刻结束,把值交还给调用它的地方。

add.cpp CPP
#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;
}
💡
其实你一直在用 return
从第 1 讲起,main 结尾的 return 0; 其实就是 main 把一个 int 返回给操作系统—— 只是当时没细讲。今天是第一次自己写返回类型不是 void 的函数。
⚡ 动手实操 约 5 分钟

把 add 改成 subtract

照着 add.cpp 的样子,自己写一个 int subtract(int a, int b), 返回 a - b。运行前先猜 subtract(10, 3) 的结果,再验证。

第二段

对比:只打印 vs 真正返回

📖 理论讲解

同样是求和,写法不一样

把上面的 printSum 改成有返回值的版本,对比一下能做的事情多了多少:

sum_return.cpp CPP
#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 后面的值—— 可以赋给变量,也能直接嵌进更大的表达式里,甚至嵌套调用自己。

square_chain.cpp CPP
#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

Python:不用声明返回类型

def square(n):

return n * n

VS
C++

C++:必须写明返回类型

int square(int n) {

return n * n;

}

⚡ 动手实操 约 5 分钟

预测再验证

运行 square_chain.cpp 前,先手算 abc 分别是多少,写在纸上,再运行对答案。

第四段

提前 return,与每条路径都要返回

📖 理论讲解

回忆第 7 讲:提前 return

第 7 讲在 main 里用过“提前 return”——校验不通过就直接结束, 后面的代码不再执行。这个技巧在自定义函数里同样适用:

is_valid_score.cpp CPP
bool isValidScore(int score) {
    if (score < 0 || score > 100) {
        return false;   // 不合法,函数立刻结束,下面的代码不执行
    }
    return true;
}
⚠️
有返回值的函数,每条路径都得 return
如果某个分支忘了写 return,编译器通常会警告,但不一定拒绝编译。 一旦程序沿着这条路径执行到函数末尾,就会产生未定义行为:程序的行为没有保证, 不能使用这个结果。
missing_return.cpp CPP
int absValue(int n) {
    if (n < 0) {
        return -n;
    }
    // n >= 0 的情况忘了写 return,这条路径没有返回值
}
⚡ 动手实操 约 8 分钟

补全缺失的 return

missing_return.cpp 补成完整程序,给 n >= 0 的情况也补上 return,让每条路径都有返回值。

  1. 补完后,用几个正数和负数分别调用 absValue,确认结果正确。
  2. 想一想:能不能不用 if / else 两个分支,只用一条语句写出绝对值?
实战

动手写四个有返回值的函数

练习 12-1

平方函数

写一个 int square(int n),返回 n 的平方。 在 main 里对 1 到 5 分别调用并输出结果。

练习 12-2

摄氏转华氏

写一个 double celsiusToFahrenheit(double c),返回摄氏度 c 换算成华氏度的结果(公式:华氏 = 摄氏 × 9 / 5 + 32)。

提示:函数体只需要一行 return,把公式直接写在 return 后面即可,不用先声明中间变量。

练习 12-3

三科平均分

写一个 double average(double a, double b, double c),返回三个数的平均值。 在 main 里读入三科分数,调用它算出平均分,再用返回值判断“是否及格” (>= 60)。

练习 12-4

质数判断函数

写一个 bool isPrime(int n),返回 n 是否为质数。

提示:把第 9 讲练习里判断质数的思路搬过来——这次不直接 cout,而是用 return true / return false 把结论交出去。

收尾

小结

📖 理论讲解

这节课你掌握了

能力用到的工具
声明函数的返回类型int / double / bool 函数名(参数)
把值交回调用处return 值;
让返回值参与后续计算函数调用当表达式用
避免路径缺少返回值检查每个分支都有 return
💡
下节课预告
模块四最后一讲:把加减乘除各自封装成有返回值的函数, main 只负责读输入、选运算、调用函数、输出结果——函数版计算器。