CC++ & Algorithm

C++函数的调用与返回值

困难42
语言版本:C++Python
概述:叫醒积木干活,它能算出结果并告诉你答案。

函数调用与返回值:让代码“跑”起来

函数就像你收藏的一个“积木块”,平时放在那里不动。只有当你在程序中调用它时,它才会开始工作。调用函数时,你还可以给它一些“材料”(参数),它做完事情后可能会把结果返回给你,就像按计算器:你输入数字(参数),它算出答案(返回值)显示在屏幕上。

下面我们一起来看看函数是怎么被“叫醒”的,以及返回值到底是怎么回事。


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) 就是函数调用。35 叫做实际参数(实参),它们会传给函数定义中的 ab

生活例子:你有一台自动售货机(函数),你投币并按下按钮(调用),机器收到指令后输出一瓶可乐(返回值)。


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. 相关知识点指引

学会了函数调用和返回值,你还可以继续探索:

  • 函数参数:参数的传值方式、默认参数等。
  • 函数重载:同一个函数名可以处理不同类型的参数。
  • 递归函数:函数调用自己,解决复杂问题(比如计算阶乘)。
  • 局部变量与全局变量:函数内部定义的变量只在函数内有效。

记住:调用函数就像请朋友帮忙,你给朋友材料(参数),他做完后要么把结果(返回值)交给你,要么只做事情不说话。多加练习,你就能让“积木”组合出强大的程序!

例题精讲

1单选题

以下关于C++函数返回值的说法,正确的是?

A函数可以返回局部变量的引用,只要该变量在函数返回后仍有效。
B函数返回类型为void时,可以使用return;语句。
C函数返回类型为int时,如果函数末尾没有return语句,则返回0。
D函数可以返回数组。
2判断题

在C++中,函数调用时实参的求值顺序是由编译器决定的,程序员不能假设特定的求值顺序。

3填空题
完成函数定义,使其返回两个整数中的最大值。
int max(int a, int b) {
    return ___;
}
4单选题

以下关于函数原型声明的选项中,正确的是?

Aint func(int a, int b);
Bint func(int, int);
Cint func(int a, b);
DA和B都正确
5填空题
完成main函数中的语句,调用add函数计算3和4的和并输出。
int add(int x, int y);
int main() {
    int a=3, b=4;
    cout << ___;
}