前言

函数是C语言中的基本构建块之一,它允许我们将代码组织成可重用、模块化的单元。

本文将逐步介绍C语言函数的基础概念、参数传递、返回值、递归以及内联函数和匿名函数。

一、人物简介

  • 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。

  • 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。

二、基础概念

  • 函数是一个独立的代码块,可以接收输入参数并执行特定任务。

  • 它可以用于执行特定的操作或计算,并可以返回一个值(可选)。

  • 以下是一个简单的示例:

#include <stdio.h>

// 声明函数
int addNumbers(int a, int b) {
int sum = a + b;
return sum;
} int main() {
// 调用函数
int result = addNumbers(3, 4);
printf("两数之和:%d\n", result); return 0;
}
  • 上述代码中,我们声明了一个名为addNumbers的函数,它接收两个整数参数并返回它们的和。

  • main函数中,我们调用了addNumbers函数,并将结果打印到控制台上。

  • 运行结果

两数之和:7

三、参数传递

  • 函数可以通过参数接收外部传入的数据。
  • 在C语言中,有两种参数传递的方式:按值传递和按引用传递。
  • 代码示例
#include <stdio.h>

// 按值传递
void incrementByValue(int num) {
num += 1;
} // 按引用传递
void incrementByReference(int* numPtr) {
(*numPtr) += 1;
} int main() {
int num = 5; incrementByValue(num);
printf("按值传递后的值:%d\n", num); incrementByReference(&num);
printf("按引用传递后的值:%d\n", num); return 0;
}
  • 在上面的示例中,我们定义了两个函数incrementByValueincrementByReference

  • incrementByValue按值传递参数,即在函数内部对参数的修改不会影响到原始变量。

  • incrementByReference按引用传递参数,通过传递指针的方式,可以在函数内部修改原始变量的值。

  • 运行结果

按值传递后的值:5
按引用传递后的值:6

四、返回值

函数可以返回一个值,这使得我们可以从函数中获取计算结果或执行状态。

#include <stdio.h>

// 返回两个数中较大的数
int max(int a, int b) {
if (a > b) {
return a;
} else {
return b;
}
} int main() {
int a = 3;
int b = 4; int maxValue = max(a, b);
printf("较大的数:%d\n", maxValue); return 0;
}
  • 在上述示例中,max函数接收两个整数参数并返回较大的数。

  • main函数中,我们调用max函数,并将结果打印到控制台上。

  • 运行结果

较大的数:4

五、递归函数

  • 递归是一种函数调用自身的技术。

  • 它在解决一些问题时非常有用,如计算阶乘、斐波那契数列等。

  • 代码示例

#include <stdio.h>

// 计算阶乘
int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
} int main() {
int num = 5;
int result = factorial(num);
printf("%d的阶乘:%d\n", num, result); return 0;
}
  • 在上面的示例中,factorial函数使用递归的方式计算一个数的阶乘。

  • main函数中,我们调用factorial函数,并将结果打印到控制台上。

  • 运行结果

5的阶乘:120

六、内联函数

  • 内联函数是一种函数调用的优化方式,编译器会将函数的代码直接嵌入到调用该函数的地方,而不是通过函数调用的方式进行执行。

  • 内联函数的好处是可以减少函数调用的开销,提高程序的执行效率。

  • 使用内联函数可以通过在函数定义前加上关键字inline来标识。

  • 代码示例

#include <stdio.h>

// 内联函数
inline int square(int num) {
return num * num;
} int main() {
int result = square(5);
printf("平方:%d\n", result); return 0;
}
  • 在上述示例中,我们定义了一个内联函数square,它计算一个数的平方。

  • main函数中,我们调用square函数,并将结果打印到控制台上。

  • 运行结果

平方:25

七、匿名函数

  • C语言本身不直接支持匿名函数,但可以使用函数指针和函数指针结构体来模拟匿名函数的功能。
  • 代码示例
#include <stdio.h>

// 匿名函数模拟
typedef int (*Operation)(int, int); int performOperation(int a, int b, Operation op) {
return op(a, b);
} int main() {
Operation add = [](int a, int b) {
return a + b;
}; int result = performOperation(3, 4, add);
printf("结果:%d\n", result); return 0;
}
  • 在上述示例中,我们使用函数指针结构体Operation来模拟匿名函数。

  • 我们定义了一个匿名函数add,它实现了两个数的加法运算。然后,我们将add函数作为参数传递给performOperation函数,并打印结果到控制台上。

  • 运行结果

结果:7

小结

通过这篇文章,我们学会了

1、函数的概念,参数传递,函数返回值

2、递归函数

3、内联函数

4、匿名函数

欢迎各位 点赞 收藏 评论,如有错误请留言指正,非常感谢!

逍遥自在学C语言 | 函数初级到高级解析的更多相关文章

  1. 逍遥自在学C语言 | 位运算符&的高级用法

    前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位 ...

  2. 逍遥自在学C语言 | 位运算符^的高级用法

    前言 在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一 ...

  3. 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土

    一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.C语言简介 C语言是一种高级语言,运行效率仅次于汇编,支持跨平 ...

  4. 逍遥自在学C语言 位运算符 "|" 的5种高级用法

    前言 在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是 ...

  5. 逍遥自在学C语言 | 变量、常量与数据类型

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.基本数据类型 1.整型 C语言中的整型数据如下表所示: ...

  6. 逍遥自在学C语言 | 算数运算符

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.算数运算符简介 C语言的算数运算符,是用来完成基本的算术 ...

  7. 逍遥自在学C语言 | 位运算符的基础用法

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表达方式 位运算符是一组用于在二进制数之间进行操作 ...

  8. 逍遥自在学C语言 | 关系运算符

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 关系运算符的作用是判断符号两边大小的关系 ...

  9. 逍遥自在学C语言 | 逻辑运算符

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 ...

  10. 逍遥自在学C语言 | 赋值运算符

    前言 在C语言中,赋值运算符用于将一个值赋给变量 这个过程分为两个步骤: 计算赋值运算符右侧的表达式 将结果赋给左侧的变量. C语言提供了多个不同的赋值运算符,包括基本的赋值运算符.复合赋值运算符以及 ...

随机推荐

  1. [软件工程/数据工程] 软件工程&数据工程知识体系

    1 概述 本篇是为了重新总结.重新编写5年前(2018-12-31 00:06),临近毕业时的一篇文章软件工程专业知识体系[求职/就业]而作,至此篇文章发布时,原文文章应已被删除.但第1章节中仍会存在 ...

  2. [Linux]监控外部用户登录及外部主机连接情况

    1 外部用户/外部主机 /var/log 在CentOS系统上,用户登录历史存储在以下这些文件中: /var/log/wtmp 用于存储系统连接历史记录被last工具用来记录最后登录的用户的列表 /v ...

  3. ASP.NET Core - 缓存之分布式缓存

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...

  4. 今天能恢复我的Django吗——恢复了!

    今天能用两小时恢复我的Django吗 实在是累了,昨天和队友改bug的时候为了能在我的电脑上实现他的程序就在datagrip中删了我django建的表.没想到啊,这一删就全是报错!! 不说了,今天看看 ...

  5. MySQL概述与安装

    MySQL数据库 概要: 一.MySQL数据库的概述 二.MySQL数据库的搭建 三.MySQL数据库软件的使用 四.MySQL数据类型 五.MySQL数据库数据的操作 一.初始MySQL数据库 1. ...

  6. 【机器学习与深度学习理论要点】20. 什么是激活函数,为什么要用激活函数,常见的激活函数和特点,softmax函数

    1)什么是激活函数,为什么要用激活函数? 激活函数,指神经网络中将输入信号的总和转换为输出信号的函数,激活函数将多层感知机输出转换为非线性,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应 ...

  7. 2020-11-04:java里,总体说一下集合框架。

    福哥答案2020-11-04: 福哥口诀法:收马李色坤(Collection.Map.List.Set.Queue).李矢数链写(List:Vector矢量.ArrayList数组.LinkedLis ...

  8. 2021-01-13:很多列的数据,任意一列组合查询,mysql能做到,但是上亿的数据量做不到了,查的时候非常慢。我们需要一个引擎来支持它。这个引擎你有了解过吗?

    福哥答案2021-01-13:[答案来自此链接:](https://www.zhihu.com/question/439121902)数据库存储设计一般分为行存储还有列存储.行存储一般每一行的数据通过 ...

  9. Spring Boot 配置文件总结

    前言 Spring Boot 中提供一个全局的配置文件:application.properties,这个配置文件的作用就是,允许我们通过这个配置文件去修改 Spring Boot 自动配置的默认值. ...

  10. 【CF】掉分总结

    比赛总结 前情提要 自从前段时间连续掉分,就心态崩了,还是自己太菜,一直想写个总结,看看这几场比赛都干了啥,以后准备怎么办.鸽了这么久的总结,是该写写了. 这是正文 首先大致提一下情感曲线(菜的真实) ...