VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 7157|回复: 164

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

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

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

②、什么是函数的定义/实现?
函数的定义就是函数真正的实现,也就是函数实现的真正代码,例如:
  1. int add(int x, int y)
  2. {
  3.         return x + y;
  4. }
复制代码


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

举个例子:
咱们之前的代码是这么写的:
  1. #include <iostream>
  2. using namespace std;

  3. int add(int x, int y)
  4. {
  5.         return x + y;
  6. }

  7. int main()
  8. {
  9.         int a = 2, b = 5;
  10.         int sum = add(a, b);
  11.         cout << "sum = " << sum << endl;
  12.         return 0;
  13. }
复制代码


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

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

3、函数的几种调用方式:
①、普通语句调用:
②、表达式调用:
③、函数参数调用:
④、嵌套调用:
函数的嵌套调用意思就是:函数a调用了函数b,函数b又调用了函数c...就这样一层一层的调用下去!

注意:函数可以嵌套调用,但是不可以嵌套定义!
这样是不行的,编译器直接报错了,在其他类似 js 的脚本语言中可以这样,但是在 C/C++ 中不允许函数的嵌套定义,只允许嵌套调用。
备注:新版本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个人几岁了?

下面编程给大家实现一下,代码见附件!

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38388453/?p=18
https://www.bilibili.com/video/av38388453/?p=19
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1YfomAFk-zg8iuP3GRmOSkA 提取码:f15u
课件+源码下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)即可加入终身Vip会员^_^




上一篇:《实用C++》第16课 函数简介
下一篇:《实用C++》第18课 局部变量和全局变量
00_avatar_middle
在线会员 发表于 2017-12-1 08:34:04 | 显示全部楼层
又出新课啦,谢谢。
回复 支持 反对

使用道具 举报

75_avatar_middle
online_vip 发表于 2017-12-1 08:50:57 | 显示全部楼层
顶顶顶顶,学习学习了,谢谢老大!!
回复 支持 反对

使用道具 举报

92_avatar_middle
在线会员 发表于 2017-12-1 09:03:20 | 显示全部楼层
可以.  看看隐藏的内容
回复 支持 反对

使用道具 举报

74_avatar_middle
在线会员 发表于 2017-12-1 09:08:07 | 显示全部楼层
誰說 不可以 嵌套定義函數的 c++11 可以哦 不過寫法 要改變下
  1. #include <iostream>

  2. int max_3(int x, int y, int z)
  3. {
  4.         static auto max_2 = [](int x,int y){
  5.                 return x > y ? x : y;
  6.         };
  7.         int max_x_y = max_2(x, y);
  8.         return max_x_y > z ? max_x_y : z;
  9. }
  10. int main()
  11. {
  12.    std::cout<<max_3(1,2,3)<<"\n";
  13.    std::cout<<max_3(3,2,1)<<"\n";
  14. }
复制代码
回复 支持 反对

使用道具 举报

51_avatar_middle
ico_lz  楼主| 发表于 2017-12-1 09:36:26 | 显示全部楼层
zuiwuchang 发表于 2017-12-1 09:08
誰說 不可以 嵌套定義函數的 c++11 可以哦 不過寫法 要改變下

哈哈,C++11得后续再讲,现在就加进来怕新手越听越糊涂了
回复 支持 反对

使用道具 举报

74_avatar_middle
在线会员 发表于 2017-12-1 10:32:03 | 显示全部楼层
继续学习
回复 支持 反对

使用道具 举报

48_avatar_middle
在线会员 发表于 2017-12-1 11:10:33 | 显示全部楼层
楼主辛苦了
回复 支持 反对

使用道具 举报

72_avatar_middle
在线会员 发表于 2017-12-1 17:19:51 | 显示全部楼层
看看是什么情况
回复 支持 反对

使用道具 举报

59_avatar_middle
online_vip 发表于 2017-12-1 18:26:48 | 显示全部楼层
17课 函数的返回值及几种调用方式 [修
回复 支持 反对

使用道具 举报

46_avatar_middle
在线会员 发表于 2017-12-1 19:22:07 | 显示全部楼层
看看。。。。。
回复 支持 反对

使用道具 举报

54_avatar_middle
在线会员 发表于 2017-12-1 21:09:41 | 显示全部楼层

又出新课啦,谢谢。
回复 支持 反对

使用道具 举报

43_avatar_middle
在线会员 发表于 2017-12-1 21:59:01 | 显示全部楼层
谢谢分享好教学
回复 支持 反对

使用道具 举报

78_avatar_middle
在线会员 发表于 2017-12-2 00:19:02 | 显示全部楼层
又更新啦,谢谢
回复 支持 反对

使用道具 举报

10_avatar_middle
在线会员 发表于 2017-12-2 09:20:06 | 显示全部楼层
第一时间来报到,老大辛苦了
回复 支持 反对

使用道具 举报

75_avatar_middle
在线会员 发表于 2017-12-3 02:54:32 | 显示全部楼层
谢谢分享      
回复 支持 反对

使用道具 举报

98_avatar_middle
在线会员 发表于 2017-12-3 10:00:18 | 显示全部楼层
不错的教程
继续学些
回复 支持 反对

使用道具 举报

57_avatar_middle
online_vip 发表于 2017-12-3 15:02:53 | 显示全部楼层
看一代码
回复 支持 反对

使用道具 举报

80_avatar_middle
在线会员 发表于 2017-12-4 22:56:07 | 显示全部楼层
坚持不懈!!!
回复 支持 反对

使用道具 举报

45_avatar_middle
online_vip 发表于 2017-12-5 16:34:09 | 显示全部楼层
谢谢老大分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-1-16 19:10

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表