《实用C++》第17课 函数的返回值及几种调用方式

本文转载自:VC驿站

https://www.cctry.com/thread-287128-1-1.html

1、函数的返回值:
一般情况下,通过函数的调用,使调用函数可以获得被调用函数的函数值,这个值就叫做返回值。
注意事项:
①、有的函数有返回值,有的函数没有返回值,具体看函数的声明类型,如果返回值类型为 void 则为无返回值类型;
②、函数的返回值是通过函数中的 return 语句获得的。一个函数中可以有一个以上的return语句,执行到哪个return就从哪个return返回了,return语句执行完之后,他之后的代码不会被执行;
③、函数内部的return返回值类型要与函数本身定义时候的返回值类型一致,即使不一致也是可以相互转化的,最终以函数定义时候的返回值类型为主进行转化,若转化不了则编译期间就报错了;
④、原则上一个函数只能有一个返回值,若要返回多个值则可以通过参数返回或者返回结构类型等等,这个以后会具体讲解的,大家先不要着急。

2、函数的声明与定义:
①、什么是函数的声明?
函数的声明就是告诉系统,或者告诉编译器,某个函数的“样子”,这个样子就是函数的基本信息,包括:函数的名字、有几个参数,每个参数的类型,函数的返回值类型等等。目的就是为了让编译器知道函数的信息,好让编译通过。
举个例子:你要帮张三购买火车票,拿着张三的身份证到火车站去买,售票员看到张三的身份证之后就知道有张三这么个人,身份证号是多少多少,于是对张三有个大概的了解了,可以给张三订票,出票!其实这个身份证就相当于函数声明的意思,有了这个身份证就可以对张三有个大概的了解了。函数的声明形式如下:例如:
int add(int x, int y); //注意结尾的分号,不可少

②、什么是函数的定义/实现?
函数的定义就是函数真正的实现,也就是函数实现的真正代码,例如:

int add(int x, int y)
{
        return x + y;
}

函数的定义比声明更具体,不仅仅包含了函数的名字,各个参数的类型,还包括函数的返回值,最重要的是有函数体,即函数的实现。这个是作为编译器链接用的。函数的定义才是一个完整的、独立的单位。

举个例子:
咱们之前的代码是这么写的:

#include <iostream>
using namespace std;

int add(int x, int y)
{
        return x + y;
}

int main()
{
        int a = 2, b = 5;
        int sum = add(a, b);
        cout << "sum = " << sum << endl;
        return 0;
}

那我要是把 add 和 main 函数的位置颠倒一下呢?会有什么问题发生,下面我演示给大家看!
visual studio 2013 编译器直接报错了:error C3861: “add”:  找不到标识符

add 函数我明明写在那了为什么还告诉我找不到呢?其实这就是编译顺序的问题。且听我语音讲解细细道来!
如何解决呢?答案就是加上前置声明!

3、函数的几种调用方式:
①、普通语句调用:

#include <iostream>
using namespace std;

int add(int x, int y)
{
        return x + y;
}

int main()
{
        int a = 2, b = 5;
        int sum = add(a, b);
        cout << "sum = " << sum << endl;
        return 0;
}

②、表达式调用:

int main()
{
        int a = 2, b = 5;
        cout << "sum = " << add(a, b) << endl;
        return 0;
}

③、函数参数调用:

#include <iostream>
using namespace std;

int add(int x, int y)
{
        return x + y;
}

void print(int sum)
{
        cout << "sum = " << sum << endl;
}

int main()
{
        int a = 2, b = 5;
        print(add(a, b));
        return 0;
}

④、嵌套调用:
函数的嵌套调用意思就是:函数a调用了函数b,函数b又调用了函数c...就这样一层一层的调用下去!

int max_2(int x, int y)
{
        return x > y ? x : y;
}

int max_3(int x, int y, int z)
{
        int max_x_y = max_2(x, y);
        return max_x_y > z ? max_x_y : z;
}

int main()
{
        int a = 2, b = 5, c = 3;
        int max_num = max_3(a, b, c);
        cout << "max num = " << max_num << endl;
        return 0;
}

注意:函数可以嵌套调用,但是不可以嵌套定义,例如:

int max_3(int x, int y, int z)
{
        int max_2(int x, int y)
        {
                return x > y ? x : y;
        }
        int max_x_y = max_2(x, y);
        return max_x_y > z ? max_x_y : z;
}

这样是不行的,编译器直接报错了,在其他类似 js 的脚本语言中可以这样,但是在 C/C++ 中不允许函数的嵌套定义,只允许嵌套调用。

⑤、递归调用:
在调用一个函数的过程中又出现或者有需要直接或间接的调用该函数本身,即自己调用自己,这样的情况称作函数的递归调用,在C/C++语言中是允许的。但要注意不能无限递归,那样的话就类似死循环了,应该竭力避免,必须要有最终能跳出递归的条件。
什么情况下需要这种函数的递归调用呢?一般是为了解决那种条件相同或类似的一环套一环的问题。举个例子:
教室里一排共计10个人,问第10个人几岁了,他说我比第9个人大两岁,问第9个人几岁了,他说我比第8个人大两岁,问第8个人几岁了,他说我比第7个人大两岁,问第7个人几岁了,他说我比第6个人大两岁,问第6个人几岁了,他说我比第5个人大两岁,问第5个人几岁了,他说我比第4个人大两岁,问第4个人几岁了,他说我比第3个人大两岁,问第3个人几岁了,他说我比第2个人大两岁,问第2个人几岁了,他说我比第1个人大两岁,问第1个人几岁了,他说我今年10岁了(这个就是最终跳出递归的条件)。问题是:问第10个人几岁了?

下面编程给大家实现一下:

#include <iostream>
using namespace std;

int get_age(int who)
{
        int ret_age = 0;
        if (who > 1)
        {
                ret_age = get_age(who - 1) + 2;
        }
        else
        {
                ret_age = 10;
        }

        return ret_age;
}

int main()
{
        int age = get_age(10);
        cout << "age = " << age << endl;
        return 0;
}

相关细节分析详见视频教程讲解!
备注:关于内联函数、函数的重载、函数模版、有默认参数的函数,在以后的教程中会给大家讲解的!

第17课视频教程下载地址:

https://www.cctry.com/thread-287128-1-1.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值