函数(下) C语言

news2024/12/27 13:38:10

函数下

  • 嵌套调用和链式访问
    • 1. 嵌套调用
    • 2. 链式访问
  • 函数的声明和定义
    • 1. 单个文件
    • 2. 多个文件
    • 3. static 和 extern
      • 3.1 static

嵌套调用和链式访问

1. 嵌套调用

嵌套调用就是函数之间的互相调用,每个函数就像⼀个乐高零件,正是因为多个乐高的零件互相无缝的配合才能搭建出精美的乐高玩具,也正是因为函数之间有效的互相调用,最后写出来了相对大型的程序。那我们到底该如何去使用呢?下面给大家举一个例子,计算某年的某个月一共有多少天?在这里插入图片描述
下面展示一些 内联代码片

int is_leap_year(int y)
{
	if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
		return 1;
	else
		return 0;
}

int getday(int y, int m)
{
	int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	int day = arr[m];
	if (is_leap_year(y) && m == 2)
		day += 1;

	return day;
}

int main()
{
	int year = 0;
	int month = 0;
	scanf("%d %d", &year, &month);
	int day = getday(year, month);
	printf("%d\n", day);
	return 0;
}

从上面的代码我们可以看到使用了两个函数的嵌套调用,is_leap_year函数在getday函数中被调用了一次,这也就是典型的函数嵌套,在上述代码中我们先判断年份是不是闰年,再进行输出,另外我们也可以看到有一点就是,在数组的方面我们使用到了一个小小的技巧,大家可注意到我在数组的前面加上了一个0,其实不难理解,我们的数组下标是从0开始的,那么如果我们打印一个0,那么arr[1]是不是就直接对应的是一月份的天数,就更加直观,也更加清晰。

2. 链式访问

所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数,像链条⼀样将函数串起来就是函数的链式访问。下面展示一些 内联代码片

int main()
{
	int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度

	printf("%d\n", len);//2.打印⻓度

	return 0;
}

前面的代码完成动作写了2条语句,把如果把strlen的返回值直接作为printf函数的参数呢?这样就是⼀个链式访问的例子了。下面展示一些 内联代码片

int main()
{
	printf("%d\n", strlen("abcdef"));//链式访问

	return 0;
}		

函数的声明和定义

1. 单个文件

⼀般我们在使⽤函数的时候,直接将函数写出来就使用了。比如:我们要写⼀个函数判断⼀年是否是闰年。在这里插入图片描述
上面代码中橙⾊的部分是函数的定义,绿色的部分是函数的调用。这种场景下是函数的定义在函数调用之前,没啥问题。但是我们要注意的是如果一个函数体在我们要使用的部分后面,也就是说我们是先调用函数之后再写出函数的主体,如果这样的话编译器就会报错,所以我们在使用函数的时候最好要提前声明一下,比如像这样:在这里插入图片描述
函数的调用⼀定要满足,先声明后使用;函数的定义也是⼀种特殊的声明,所以如果函数定义放在调用之前也是可以的。

2. 多个文件

⼀般在企业中我们写代码时候,代码可能比较多,不会将所有的代码都放在⼀个文件中,我们往往会根据程序的功能,将代码拆分放在多个文件中。一般情况下,函数的声明、类型的声明放在头文件(.h)中,函数的实现是放在源源件(.c)文件中。
如下:
add.c
在这里插入图片描述
add.h在这里插入图片描述
test.c在这里插入图片描述
在这里插入图片描述
运行结果:在这里插入图片描述

3. static 和 extern

staticextern是C语言中比较重要的关键字,static是静态的 的意思,可以用来:
• 修饰局部变量
• 修饰全局变量
• 修饰函数
extern 是用来声明外部符号的。
在讲解 static 和 extern 之前再讲⼀下:作用域和生命周期。
作用域(scope)是程序设计概念,通常来说,⼀段程序代码中所用到的名字并不总是有效(可用)的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1 局部变量的作用域是变量所在的局部范围。
2 全局变量的作用域是整个工程(项目)。

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
1.局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。

3.1 static

(1) 修饰局部变量:
在这里插入图片描述
对比代码1和代码2的效果,理解 static 修饰局部变量的意义。
代码1的test函数中的局部变量i是每次进⼊test函数先创建变量(生命周期开始)并赋值为0,然后++,再打印,出函数的时候变量生命周期将要结束(释放内存)
代码2中,我们从输出结果来看,i的值有累加的效果,其实 test函数中的i创建好后,出函数的时候是不会销毁的,重新进入函数也就不会重新创建变量,直接上次累积的数值继续计算。
结论:static修饰局部变量改变了变量的⽣命周期,生命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,生命周期就和程序的生命周期⼀样了,只有程序结束,变量才销毁,内存才回收,但是作用域不变的。
使用建议:未来⼀个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static修饰。

(2) 修饰全局变量:
在这里插入图片描述
extern 是用来声明外部符号的,如果⼀个全局的符号在A文件中定义的,在B文件中想使用,就可以使用 extern 进行声明,然后使用。
代码1正常,代码2在编译的时候会出现链接性错误。
结论:⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。
使用建议:如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他文件发现,就可以使用static修饰。

(3) 修饰函数:在这里插入图片描述
代码1是能够正常运行的,但是代码2就出现了链接错误。
其实 static 修饰函数和 static 修饰全局变量是⼀模⼀样的,⼀个函数在整个工程都可以使用,被static修饰后,只能在本文件内部使用,其他文件无法正常的链接使用了。
本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使用。但是被 static 修饰后变成了内部链接属性,使得函数只能在自己所在源文件内部使用。
使用建议:⼀个函数只想在所在的源⽂件内部使用,不想被其他源文件使用,就可以使⽤ static 修饰。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MacOS - 启动台多了个『卸载 Adobe Photoshop』

问题描述 今天安装好了 Adobe Ps,但是发现启动台多了个『卸载 Adobe Photoshop』强迫症又犯了,想把它干掉! 解决方案 打开访达 - 前往 - 资源库,搜索要卸载的名字就可以看到,然后移除到垃圾筐

17. 一个I/O项目:构建命令行程序(下)

目录 五、采用测试驱动开发完善库的功能5.1 编写失败测试用例5.2 编写成功测试用例5.3 在run函数中打印搜索到的行 六、添加大小写不敏感功能七、将错误信息输出到标准错误八、附录完整代码 五、采用测试驱动开发完善库的功能 5.1 编写失败测试用例 在lib.rs中写一个简单的se…

爱死了,4款逆天IOS App推荐!

河马喝水提醒 「河马喝水提醒」是一款生活小助手应用,旨在帮助用户建立并维持定时喝水的良好习惯。该应用不仅是一个提醒闹钟,更是健康生活的贴心伙伴。它每天定时推送提醒,帮助用户在繁忙的日常中不忘补充水分。此外,该应用还提供…

jenkins中配置参数化,并在python脚本接收参数实现参数化执行

在公司内进行Monkey测试脚本集成jenkins时,因为需要指定公司内不同的app进行测试。那么可以有两种方法解决该问题,要么创建多个脚本文件,多个jenkins jobs,进行构建。要么可以在配置job时通过传参数的方式,在python脚本…

Facebook视角下的文化多样性:全球社交的聚合

在当今数字化时代,社交媒体已经成为连接全球各地人们的重要平台之一。而在这众多平台中,Facebook无疑是其中的佼佼者,不仅仅是一个社交网络,更是一个涵盖了丰富文化多样性的全球社交聚合地。本文将深入探讨Facebook在促进文化多样…

[python] matplotlib.pyplot 绘制高宽不同、多行多列子视图

假如我们想要绘制这样的效果: 方式1: # -*- coding: utf-8 -*- import matplotlib.pyplot as plt import numpy as np# 声明一个GridSpec对象实例,创建的是6行2列的图像布局。 grid plt.GridSpec(nrows6, ncols2, wspace0.2, hspace0.2)# 设…

京东618 :AI总裁数字人、京东Apple Vision Pro版亮相

2004年6月18日,刚刚转型电商才半年的京东,用最互联网的方式为忠实粉丝打造了一场价格降到“难以置信”的店庆促销活动,这场促销活动还有一个很具有当年网络小说特质的名字——“月黑风高”。 2024年京东618,早已成为一场亿万消费…

【只是查漏补缺】关于动力节点2024版java新课程

反编译命令 javap进行反编译操作,例如:javap Test;使用jd-gui.exe来实现反编译。 二进制数据是采用0和1来表示,则换算单位肯定为2的n次方,而2的10次方恰好等于1024,所以就使用了1024来作文文件存储的换算单…

Erlang程序设计[Part1-Part2 chapter4]

前言: 环境安装 Erlang Shell,CSDN搜教程 Erlang Shell实操 启动 erl Erlang Shell以表达式为执行单位? 结束标志 .加上回车 Part1 为何用 Erlang chapter 1 什么是并发 并发vs并行 并发 单核cpu运行多个进程 一次运行一个 并行 多…

批量导出兜底回复对话,迭代优化聊天机器人 | Chatopera 云服务

持续优化知识库 聊天机器人的知识库,对话技能,需要长期的优化。这是因为,一方面,初期上线的机器人所依赖的数据量通常有限;另一方面,市场不断变化,客户产品新的问题。 上线聊天机器人的目的之…

MyBatis Plus Generator代码生成

一、MyBatis Plus Generator MyBatis Plus是一个功能强大的持久层框架,它简化了MyBatis的使用,提供了许多便捷的功能。其中,MyBatis Plus Generator是一个强大的代码生成器,可以帮助我们快速地根据数据库表结构生成对应的实体类、…

怎么控制多个存储设备的访问权限?数据安全存储方案来了

数据安全存储是指将数据以安全的方式存储在存储系统中,以确保数据的机密性、完整性和可用性。要控制数据安全存储的权限以保障安全,可以采取以下措施: 访问控制列表(ACLs):使用ACLs来定义对存储数据的访问权…

丹麦海外媒体报道:媒体投放发稿助力企业在海外扭转战局

大舍传媒 丹麦海外媒体报道中,大舍传媒作为一家专业的媒体投放公司,正发挥着重要作用,帮助企业在海外扭转战局。作为丹麦领先的媒体投放机构,他们为企业提供了全方位的品牌传播服务,帮助企业在海外市场取得成功。 大舍…

MySQL 架构

本篇主要介绍一下MySQL的架构 目录 一、整体架构 二、连接层 网络端口 连接管理线程 三、服务层 NoSQL接口与SQL接口 Parser(语法分析器) Optimizer(查询优化器) Cache & Buffers(缓存) 四、存储引擎层…

可复用验证的测试用例 5大编写技巧

编写可复用验证的测试用例,节省了编写新测试用例的时间和资源,提高了测试效率和项目质量,减少错误修复成本,有利于实现较高的投入产出比。缺乏可复用的测试用例会导致测试团队不断重复创建相似的测试场景,消耗大量时间…

CleanMyMac中文版2024破解版安装包下载最新官方免费激活码

CleanMyMac中文版,让你的电脑焕然一新! 大家好,今天我要给大家推荐一款神奇的软件——CleanMyMac中文版。作为一个长期使用Mac的用户,我一直在寻找一款能够彻底清理电脑垃圾和优化系统的工具,而CleanMyMac正是我心心念…

封装音视频编解码和渲染的动态链接库编译和测试

1.动态链接库的编译 生成了以下几个文件 我们把生成的lib文件复制到lib文件夹中 其余三个文件不变动 2.进行测试看是否可以用生成的xcodec.lib库文件里的接口函数 以上是重新创建的新项目,导入了xcodec.lib,其他配置同以前项目 库测试结果 运行显示我们…

优思学院|精益生产10大工具全解析

精益生产是一种管理哲学,其核心思想是通过消除浪费、持续改进和最大化价值来提高企业效率和效益。本文将详细解析精益生产的10大工具,帮助企业更好地理解和实施精益生产,以实现卓越的经营绩效。 一、价值流图 (Value Stream Mapping) 前言 …

大模型的分类:探索多样化的人工智能模型

随着人工智能技术的飞速发展,大型预训练模型(以下简称“大模型”)已经在自然语言处理、计算机视觉、语音识别等多个领域取得了显著的成果。这些模型通过在海量数据上进行预训练,能够捕捉到丰富的特征信息,为各种下游任…

C#标志位的使用

C#作为一种功能强大的编程语言,是在.NET框架中广泛使用的语言之一。在实际应用中,C#的标志位在各种系统设计和编程实践中会涉及到。这篇文章将讨论如何使用C#的标志位来跟踪报警声音的播放状态。 报警系统是一种广泛应用的系统,它可以在关键时…