☀️光天化日学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、返回类型

  返回类型就是返回值的数据类型,被定义在函数名前面,可以是intdoublecharshort等等,当然也可以是一个结构体,或者指针,前提是需要和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 语言大神!

课后习题


🔥让天下没有难学的算法🔥

C语言免费动漫教程,和我一起打卡!
🌞《光天化日学C语言》🌞

入门级C语言真题汇总
🧡《C语言入门100例》🧡

几张动图学会一种数据结构
🌳《画解数据结构》🌳

组团学习,抱团生长
🌌《算法入门指引》🌌

竞赛选手金典图文教程
💜《夜深人静写算法》💜

以上是关于☀️光天化日学C语言☀️(34)- 函数进阶 | 面向过程编程的主要内容,如果未能解决你的问题,请参考以下文章

☀️光天化日学C语言☀️(35)- 局部变量和全局变量

☀️光天化日学C语言☀️(36)- 作用域

☀️光天化日学C语言☀️(32)- continue 关键字 | 下一个!

☀️光天化日学C语言☀️(29)- while 语句 | 死循环啦!

☀️光天化日学C语言☀️(31)- break 关键字 | 当断则断!

☀️光天化日学C语言☀️(30)- for 语句 | 子子孙孙无穷尽也