3.C语言——函数

函数

  • ==1.什么是函数==
  • ==2.函数的分类==
      • 1.库函数
      • 2.自定义函数
  • ==3.函数的参数==
      • 1.实际参数(实参)
      • 2.形式参数(形参)
  • ==4.函数的声明==
      • 1.同一个文件的函数声明
      • 2.多文件的函数声明
  • ==5.函数的调用==
  • ==6.函数的嵌套调用和链式访问==
      • 1.嵌套调用
      • 2.链式访问
  • ==7.函数递归==

1.什么是函数

函数也称为子程序,在计算机科学中,子程序是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软 件库。

2.函数的分类

1.库函数

库函数就是C语言本身给我们已经定义好的函数,作为程序员我们可以直接使用,就像printf()和scanf()。
注意:使用库函数必须包含头文件,例如我们使用printf()与scanf()时要引用stdio.h头文件,即我们通常写的#include<stdio.h>

常见的库函数有IO函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数,其他库函数,后期用到的时候具体讲解。

2.自定义函数

自定义函数就是程序员自己定义用于实现特定功能的函数!这给程序员一个很大的发挥空间。

格式:
return_type function_name( parameter list )
{body of the function
}
  • 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
  • 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。

根据有无返回值可将函数分为有返回值函数,无返回值函数
有返回值的函数就返回一个值,而无返回值的函数就执行某些操作

根据有无参数可将函数分为有参函数,无参函数

例如:无参有返回值的函数
在这里插入图片描述
有参有返回值的函数
在这里插入图片描述

3.函数的参数

1.实际参数(实参)

真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。

2.形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

在这里插入图片描述

4.函数的声明

1.同一个文件的函数声明

一般如果把自定义函数写在了主函数后,一般要进行声明。函数声明会告诉编译器函数名称及如何调用函数

格式:
return_type function_name( parameter list );

上面的add函数声明为:
写在主函数main()的上面

int add(int a,int b);

在这里插入图片描述正确示例:
在这里插入图片描述

2.多文件的函数声明

我们在设计多文件程序的时候,一般在以.h为结尾的头文件内放置函数的声明在.c源文件内放置函数的定义

math.h的内容
放置函数的声明

#ifndef __MATH_H__
#define __MATH_H__ int max(int x, int y); int min(int x, int y);
#endif 

math.c的内容
放置函数的实现

#include "math.h" 
int max(int x, int y) { 	return x > y ? x : y;} 
int min(int x, int y) { return x < y ? x : y; 
} 

主函数为

#include<stdio.h>
#include"math.c" 
int main() { int a = 10; 	int b = 20; 	printf("max=%d\n", max(a, b)); 	printf("min=%d\n", min(a, b)); 
} 

5.函数的调用

创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:
在这里插入图片描述

6.函数的嵌套调用和链式访问

1.嵌套调用

在这里插入图片描述
特别注意:C语言中,函数可以嵌套调用,但是不能嵌套定义

2.链式访问

通俗来讲,链式访问就是把一个函数的返回值作为另外一个函数的参数
貌似与嵌套调用挺像的,但两者是存在区别的:嵌套调用是在函数中调用函数,而链式访问则是将一个函数的返回值作为另一个函数的参数。

#include <stdio.h>
int main()
{printf("%d", printf("%d", printf("%d", 43)));//结果是啥?//注:printf函数的返回值是打印在屏幕上字符的个数return 0;
}

打印结果是什么呢?最后的打印结果是4321,为什么呢?此处给大家普及一个知识点,printf()函数的返回值是正确输出在屏幕上的字符数,例如,输出在屏幕上的数字是43,此时函数的返回值就是2,如果打印在屏幕上的数字是2的话,返回值就是1,那么此处输出的结果也就不难理解了。

另外一个给大家补充的点是:在上面这个函数中,究竟是如何进行执行的呢?首先执行的是最外层的printf()函数,而最外层函数的返回值依赖于次外层函数的返回值,而次外层函数的返回值又依赖于内层函数的返回值,就是层层向内调用然后层层返回。printf(“%d”,43)的返回值是2,而printf(“%d”,2)的返回值是1,所以最终输出在屏幕上的就是4321,因为最内层函数先执行进行输出的,所以也可以理解成是由内向外进行执行的,但调用的顺序却是由外向内的。

7.函数递归

程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的条件
(1)存在限制条件,当满足这个限制条件的时候,递归便不再继续。
(2)每次递归调用之后越来越接近这个限制条件。

int factorial(int n)
{if (n <= 1)return 1;elsereturn n * factorial(n - 1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/416761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git学习笔记(第6章):GitHub操作(远程库操作)

目录 6.1 远程库操作 6.1.1 创建远程库 6.1.2 命名远程库 6.1.3 本地库推送到远程库(push) 6.1.4 远程库拉取到本地库(pull) 6.1.5 远程库克隆到本地库(clone) 6.2 团队内协作 6.3 跨团队协作 6.4 SSH免密登录 6.1 远程库操作 命令 作用 git remote -v 查看所有远程…

第十五届蓝桥杯单片机组备赛——独立键盘矩阵键盘

文章目录 一、按键原理二、独立键盘&矩阵键盘2.1 独立按键2.2 矩阵键盘2.2.1 列扫描2.2.2 行扫描2.2.3 代码实现(行扫描实现) 三、矩阵键盘注意事项3.1 为什么要设置C1C2C3C413.2 按键消抖 一、按键原理 原理很简单&#xff0c;当我们没有按下SW2时&#xff0c;由于上拉电阻…

RNN:Long Short-term Memory(中)

目录 1 LSTM 的简图 2 LSTM 的整体结构 2.1 结构图 2.2 流程图 3 举个例子 3.1 简单看看 3.2 代入 LSTM 4 Original Network v.s. LSTM 5 细看 LSTM 原视频&#xff1a;李宏毅 2020&#xff1a;Recurrent Neural Network (Part I) 1 LSTM 的简图 LSTM 实际…

站长为什么都说WordPress太复杂不会用要放弃?

网络上经常看到有站长说要放弃WordPress&#xff0c;理由各有不同&#xff0c;比如有些说WordPress太复杂不会用&#xff1b;有些说WordPress是国外建站系统&#xff0c;在国内用来搭建访问速度太慢&#xff1b;也有些说WordPress是针对谷歌优化的&#xff0c;不适合国内的搜索…

Datawhale 强化学习笔记(二)马尔可夫过程,DQN 算法

文章目录 参考马尔可夫过程DQN 算法&#xff08;Deep Q-Network&#xff09;如何用神经网络来近似 Q 函数如何用梯度下降的方式更新网络参数强化学习 vs 深度学习 提高训练稳定性的技巧经验回放目标网络 代码实战 DQN 算法进阶Double DQNDueling DQN 算法代码实战 参考 在线阅…

Apache Solr <= 8.8.1任意文件读取漏洞复现CVE-2019-17558

一、环境准备 搭建环境vulhub&#xff0c;需要提前安装docker环境 docker安装&#xff1a;docker--安装docker-ce-CSDN博客 vulhub地址&#xff1a;https://github.com/vulhub/vulhub #创建靶场环境 mkdir /opt/vulhub cd /opt/vulhub git https://github.com/vulhub/vulhu…

2023.1.19 关于 Redis 事务详解

目录 Redis 事务对比 MySQL 事务 MySQL 事务 Redis 事务 Redis 事务原子性解释 Redis 事务详解 执行流程 典型使用场景 Redis 事务命令 WATCH 的使用 WATCH 实现原理 总结 阅读下文之前建议点击下方链接了解 MySQL 事务详解 MySQL 事务详解 Redis 事务对比 MySQL 事…

hadoop-common: CMake failed with error code 1

问题 在编译hadoop源码时遇到如下错误 hadoop-common: CMake failed with error code 1 看了这个错误表示一脸懵逼 排查 在mvn 的命令中增加 -X 和 -e mvn clean package -e -X -Pdist,native -DskipTests -Dmaven.javadoc.skip -Dopenssl.prefix/usr/local/bin/openssl 在…

【1】SM4 CBC-MAC 机制

0x01 题目 MSG1: e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2 MAC1: 0712c867aa6ec7c1bb2b66312367b2c8 ----------------------------------------------------- MSG2: d8d94f33797e1f41cab9217793b2d0f02b93d46c2ead104dce4bfec453767719 MAC2: 4366…

助力焊接场景下自动化缺陷检测识别,基于YOLOv3模型开发构建工业焊接场景下缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

Elasticsearch 分布式架构剖析及扩展性优化

1. 背景 Elasticsearch 是一个实时的分布式搜索分析引擎&#xff0c;简称 ES。一个集群由多个节点组成&#xff0c;节点的角色可以根据用户的使用场景自由配置&#xff0c;集群可以以节点为单位自由扩缩容&#xff0c;数据以索引、分片的形式散列在各个节点上。本文介绍 ES 分布…

阿里云ECS使用docke搭建redis服务

目录 1.确保正确安装好docker 2.安装redis镜像 3.创建容器设置端口映射 1.确保正确安装好docker 安装教程&#xff1a; 阿里云ECS(CentOS镜像)安装docker-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135686614?spm1001.2014.3001.5501 2.安装redis镜像…