☀️光天化日学C语言☀️(34)- 函数进阶 | 面向过程编程
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了☀️光天化日学C语言☀️(34)- 函数进阶 | 面向过程编程相关的知识,希望对你有一定的参考价值。
🔥让天下没有难学的算法🔥
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
入门级C语言真题汇总 🧡《C语言入门100例》🧡
几张动图学会一种数据结构 🌳《画解数据结构》🌳
组团学习,抱团生长 🌌《算法入门指引》🌌
竞赛选手金典图文教程 💜《夜深人静写算法》💜
文章目录
一、前言
本文作者是从 2007 年开始学 C语言 的,不久又接触了C++,基本就是 C/C++ 技术栈写了 14 年的样子,不算精通,但也算差强人意。著有《夜深人静写算法》系列,且承诺会持续更新,直到所有算法都学完。主要专攻 高中 OI 、大学 ACM、 职场 LeetCode 的全领域算法。由于文章中采用 C/C++ 的语法,于是就有不少读者朋友反馈语言层面就被劝退了,更何况是算法。
于是,2021 年 06 月 12 日,《光天化日学C语言》 应运而生。这个系列文章主要服务于高中生、大学生以及职场上想入坑C语言的志同道合之人,希望能给祖国引入更多编程方面的人才,并且让自己的青春不留遗憾!
这一章的主要内容是函数。
二、人物简介
- 第一位登场的就是今后会一直教我们C语言的老师 —— 光天。
- 第二位登场的则是今后会和大家一起学习C语言的没什么资质的小白程序猿 —— 化日。
三、函数的定义
四、函数的参数列表
函数的参数列表是以逗号分隔的一系列参数的,在函数定义时,这些参数不存在数据,只能接收调用方调用时传递进来的数据,所以称为 形式参数,简称 形参。
而当函数被调用时,这些参数是有数据的,会被函数体中的代码用到,所以被称为 实际参数,简称 实参。
1、形参
形参变量只有在函数被调用时才会分配内存,调用结束后,释放内存。所以形参变量只在函数内部有效,无法在外部使用。
2、实参
实参可以是常量、变量、表达式、函数等等,函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
3、参数匹配
实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生 类型不匹配 的错误。当然,有一种情况例外,就是有类型转换(自动类型转换 或 强制类型转换),那么实参类型也可以不同于形参类型。
4、单向传递
函数调用中发生的数据传递是单向的,只能把 实参 的值传递给 形参,而不能把形参的值反向地传递给实参。换言之,一旦完成数据的传递,实参和形参就不存在关系了。所以,在函数调用过程中,形参的值发生改变并不会影响实参。
如下代码所示:
#include <stdio.h>
void add(int x) { // (1)
++x;
}
int main() {
int a = 1;
add(a); // (2)
printf("%d\\n", a);
return 0;
}
-
(
1
)
(1)
(1) 这里的
x
代表的是形参; -
(
2
)
(2)
(2)
a
是作为实参传递进去的; - 以上代码输出的值为
1
,原因就是:函数调用,只能把 实参 的值传递给 形参,函数内部的x
虽然自增了,但是当函数调用完毕,就已经销毁了,所以当退出函数以后,a
的值没有变。
五、函数的返回值
函数的 返回值 是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过return
语句返回。而 返回类型 就是返回值的数据类型。
1、返回类型
返回类型就是返回值的数据类型,被定义在函数名前面,可以是int
、double
、char
、short
等等,当然也可以是一个结构体,或者指针,前提是需要和return
返回的数据的类型保持一致,或者能够通过类型转换达成一致。
2、返回值
返回语句的一般形式如下:
return 表达式;
1)无返回值
当一个函数没有返回值时,返回类型为void
,如下:
void func() {
printf("光天化日学C语言!\\n");
}
当定义为void
类型的函数以后,它的返回值就不能返回给任何变量了。并且,上面的代码还可以这么写:
void func() {
printf("光天化日学C语言!\\n");
return;
}
2)多返回值
任何一个函数都允许有多个return
语句,例如,求两个数中的最小值,可以写成:
int min(int a, int b){
if(a < b){
return a;
}else{
return b;
}
}
当a < b
这个条件成立时,执行return a;
;否则,执行return b
。
3)非确定性返回值
如果某个函数从一个地方返回时有返回值,而从另一个地方返回时没有返回值,这个函数并不非法,但是,我们不提倡写出这样的代码,如下:
#include <stdio.h>
int isLargerThan(int x, int y) { // (1)
if(x > y) {
return 1; // (2)
}
}
int main() {
printf("%d\\n", isLargerThan(2, 1) );
return 0;
}
-
(
1
)
(1)
(1)
int isLargerThan(int x, int y)
是一个判断x
是否大于y
的函数; -
(
2
)
(2)
(2) 但是在判断的过程中发现,当
x <= y
的情况下没有返回值,实际上,程序会默认返回一个值,但是这个值就是一个不确定的值了,有兴趣的同学可以运行一下这段代码,我运行的结果是1
。实际上,这并不是我想要的结果。
六、函数的声明和原型
C语言代码是由上到下依次执行的,原则上 函数定义 要出现在 函数调用 之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前 声明。
1、函数的声明
所谓 声明(Declaration,并非 申明),就是告诉编译器我接下来要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上,求求编译器大佬放过我吧。
函数的声明的格式就是去掉函数定义中的函数体,并在最后加上分号,如下代码所示:
返回值 函数名(参数类型1 形参1, 参数类型2 形参2 ... );
int min(int a, int b);
也可以不写形参,只写数据类型,如下代码所示:
返回值 函数名(参数类型1, 参数类型2 ... );
int min(int, int);
2、函数原型
像这样,给出了 函数名、返回类型、参数列表 等与该函数有关的信息,称为 函数原型(Function Prototype)。函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道这个函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。
#include <stdio.h>
int min(int, int);
int main() {
printf("%d\\n", min(2, 1) );
return 0;
}
int min(int a, int b) {
return a < b ? a : b;
}
- 如上代码所示,在
main
函数中调用min
函数时,min
的定义其实是在main
的后面。所以,需要在调用之前,对min
进行声明。
本文对函数进行了一个深入的介绍。
通过这一章,我们学会了:
1)函数的参数;
2)函数的返回值;
3)函数的声明;
- 希望对你有帮助哦 ~ 祝大家早日成为 C 语言大神!
课后习题
- 【第01题】A + B | 四种输入方式,开启刷题的序章
- 【第02题】给定 n,求 1 + 2 + 3 + … + n 的和 | 四种解法
- 【第13题】给定三个数 a,b,c,从小到大输出这三个数 | 最原始的排序算法思想
🔥让天下没有难学的算法🔥
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
入门级C语言真题汇总 🧡《C语言入门100例》🧡
几张动图学会一种数据结构 🌳《画解数据结构》🌳
组团学习,抱团生长 🌌《算法入门指引》🌌
竞赛选手金典图文教程 💜《夜深人静写算法》💜
以上是关于☀️光天化日学C语言☀️(34)- 函数进阶 | 面向过程编程的主要内容,如果未能解决你的问题,请参考以下文章
☀️光天化日学C语言☀️(32)- continue 关键字 | 下一个!
☀️光天化日学C语言☀️(29)- while 语句 | 死循环啦!