函数的学习(三)

news2024/12/24 0:11:16

1.函数的声明和定义

在C语言中,函数的声明和定义是分开的。

函数的声明是指在程序中提前告诉编译器有一个函数存在,并且指定了函数的名称、参数类型和返回值类型。函数的声明一般放在头文件中,它的作用是告诉编译器有一个函数存在,并且在其他地方可能会用到这个函数。

函数的声明的语法形式为:返回值类型 函数名(参数列表);

例如,下面是一个简单的函数声明示例:

int add(int a, int b);

函数的定义是指给出函数的具体实现。函数的定义包含函数的返回值类型、函数名、参数列表和函数体。函数的定义一般放在C源文件中,它的作用是给出函数的具体实现。

函数的定义的语法形式为:返回值类型 函数名(参数列表) {函数体}

例如,下面是一个简单的函数定义示例:

int add(int a, int b) {
    int sum = a + b;
    return sum;
}

在上面的示例中,函数的定义中包含了函数体的具体实现,在函数体中定义了一个局部变量sum,计算a和b的和,并将结果返回。

需要注意的是,函数的声明和定义必须一致,即参数类型、返回值类型和参数个数必须相同。否则,在函数调用时会发生编译错误。

如果将函数声明和定义放在同一个源文件(.h)中,位置如下:

#include<stdio.h>
//函数声明
int add(int, int);

int main()
{
	int a = 10;
	int b = 20;
	int ret = add(a, b);
	printf("ret = %d\n", ret);
	return 0;
}

//函数定义
int add(int x, int y)
{
	return x + y;
}

但是如果将加法函数看作是一个模块的话,就可以将函数声明放入头文件add.h中,将函数定义放入源文件add.c中,在主函数需要用到加法模块时,需要引入加法的头文件#include"add.h"即可。

如下所示

#include<stdio.h>

#include"add.h"

int main()
{
	int a = 10;
	int b = 20;
	int ret = add(a, b);
	printf("ret = %d\n", ret);
	return 0;
}

2.函数的递归

在C语言中,函数的递归是指函数在其定义中调用自身的过程。通过函数的递归调用,函数可以多次重复执行相同的操作,直到满足某个终止条件。

函数的递归调用一般包括以下几个要素:

1)基本情况:定义递归函数时,需要确定一个或多个基本情况,即递归调用结束的条件。一旦满足基本情况,递归将停止,不再进行调用。

2)递归调用:在函数体内部,通过调用自身来实现递归。通常在每次递归调用时,问题的规模会减小。

3)递归结束条件:递归函数必须定义一个或多个结束条件,以确保递归不会无限循环调用自身。

递归函数的实现可以通过以下步骤进行:

(1)将问题分解为一个或多个较小的问题。

(2)在函数内部调用自身,解决较小的问题。

(3)当满足基本情况时,不再调用自身,返回结果。

下面是一个简单的例子,演示如何使用递归函数按照顺序打印一个整型值(无符号)数字的每一位,如输入1234,则输出1 2 3 4,具体实现代码如下:

#include<stdio.h>
void print(unsigned n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);

}

int main()
{
	int  unsigned num = 0;
	scanf_s("%d", &num);
	print(num);//调用函数print()
	return 0;
}

在上面的例子中,函数printf通过递归调用自身来按顺序输出数字的每一位。当 n > 9时,递归停止。

例如输入数字1234,输出结果如下:

 接下来,再看一个例子:编写代码实现计算字符串的长度

方法一:直接使用strlen()函数

方法二:调用函数,代码如下:

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)//数组传参传递的是数组的首地址,所以要写成指针的形式
{
	int count = 0;

	while (*str != '\0')//字符串存储是以'\0'结尾的,但是并不算字符串的长度
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

 结果如下所示:

方法三:使用函数递归,代码如下:

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str+1);
	}
	else
		return 0;
}

int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

递归函数是一种强大的技术,可以用来解决多种复杂的问题。但需要注意的是,在使用递归函数时,必须确保递归能够终止,并且递归的层数不能太大,否则可能会导致栈溢出的问题。

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

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

相关文章

学生综合测评、学生测评管理系统的设计与实现

摘要 学生综合测评是学校必不可少的一个部分。在教学中&#xff0c;学生综合测评担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类学生综合测评也在不断改进。本课题所设计的学生综合测评&#xff0c;使用JSP技术与MySql数据库进行开发&#xff0c;它的优点代…

快速上手的企业视频会议系统需要具备哪些能力

随着企业规模的扩张&#xff0c;行政会议的增多以及企业的复杂性和地域分散性导致的信息传递周期过长问题&#xff0c;对企业运营效率和成本产生了负面影响。为了解决这些问题&#xff0c;许多企业开始采用视频会议系统以实现即时沟通并降低差旅开支。视频会议系统在远程沟通方…

牛客JS题(二十九) Map保存节点

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; map的基本使用forEach的注意点 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charset"utf-8" /></head><body><p>1</p><p>2<…

24.8.9数据结构|链栈和队列

链栈 1、理解 实际上是一个仅在表头进行操作的单链表,头指针指向栈顶结点或头结点,以下恋栈均指带头结点的链栈. 2、 基本操作 1、定义结构&#xff1a;节点含有数据域和指针域 2、初始化操作&#xff1a;建立一个带头结点的空栈 3、取栈顶元素操作&#xff1a;取出栈的栈顶元…

【最新】推荐6款论文ai写论文软件推荐网站平台

在当前的学术研究和写作环境中&#xff0c;AI写作工具已经成为许多学者和学生的重要助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助优化文章结构、润色语言以及进行查重等任务。以下将推荐六款优秀的AI写论文软件&#xff0c;并详细介绍它们的功能和特点。 1. 千笔-…

Spring及相关框架的重要的问题

Java框架 问题一&#xff1a;Spring框架中的单例bean是线程安全的吗&#xff1f; 看下图&#xff0c;不能被修改的成员变量就是无状态的类&#xff0c;无状态的类没有线程安全问题&#xff0c;所以在开发中尽量避免可修改的成员变量。 回答&#xff1a;不是线程安全的&#xf…

Drizzle ORM使用Azure PostgreSQL数据库迁移失败

执行 npx drizzle-kit migrate 命令报错&#xff1a; No config path provided, using default drizzle.config.ts Reading config file E:\nextjs-cloudflare-drizzle\drizzle.config.ts Using postgres driver for database querying [⡿] applying migrations...PostgresEr…

Intersection Observer API 帮你搞定前端滚动问题

前言 当我们在做需求时&#xff0c;可能经常会遇到很多跟页面的滚动有关的需求。例如 图片的懒加载&#xff1a;我们希望只加载用户当前视图窗口的图片&#xff0c;而未进入到视图窗口的图片&#xff0c;只有在进入到视图窗口时才进行加载&#xff0c;以提高页面响应速度&…

简单报表示例

简单报表 概述 简单表格报表&#xff1a;简单的表格报表。 应用场景 如下图所示&#xff0c;简单展示数据 示例说明 数据准备 在数据面板中添加数据集&#xff0c;可选择Json数据集和API服务数据集。Json数据集输入如下图所示&#xff1a; [{"到货日期":&qu…

工业智能网关在制造业数字化转型中的应用分享-天拓四方

随着工业4.0和物联网技术的飞速发展&#xff0c;工业智能网关已成为连接现场设备、实现数据采集与远程监控的关键节点。本文将以一个实际使用案例为蓝本&#xff0c;深入探讨工业智能网关的应用价值、技术特点以及实施效果&#xff0c;旨在为读者呈现一个清晰、专业且实操性强的…

vue项目打包问题

缓存导致打包后js文件404 修改vue.config.js打包输出文件名为动态&#xff0c;例如取当前时间戳。 在index.html文件添加meta标签设置不缓存。 更新完包&#xff0c;假如用户此刻正访问某一个页面时&#xff0c;访问的包还是原来的情况导致出现bug 解决VUE项目更新后需要客户手…

渲染引擎实践 - UnrealEngine引擎的 GLContext 创建过程

一:概述: 本文分析下 UnrealEngine 启动过程中创建多少个 OpenGL Context,以及每个 Context 的作用。 基于 UnrealEngine 4.25 环境。 二:临时Context 1. PreInit -> PreInitPreStartupScreen -> PreloadResolutionSettings, 用于检查图形窗口分辨率 2. PreInit -&…

Nmap——网络扫描的强大利器

一、引言 在网络安全和管理的领域中&#xff0c;了解网络的拓扑结构、设备状态以及开放的服务端口等信息至关重要。Nmap&#xff08;Network Mapper&#xff09;作为一款功能强大的网络扫描工具&#xff0c;为我们提供了深入探索网络的能力。本文将详细介绍 Nmap 的特点、功能…

三款新手剪辑软件分享,告别复杂的达芬奇剪辑软件

你们知道吗&#xff1f;一个视频能不能火&#xff0c;除了内容要够硬核&#xff0c;剪辑也是门大学问呢&#xff01;之前尝试过达芬奇剪辑&#xff0c;发现我不是很会用&#xff0c;然后最近我轮番上阵&#xff0c;试用了三款神器&#xff0c;来来来&#xff0c;让我给你们说说…

回归评价指标

这里写目录标题 1. 均方误差MSE2. 均方根误差RMSE3. 平均绝对误差MAE4. R^2^5. 调整后R^2^1. 均方误差MSE 回归数据和原始数据误差的平方和/原始数据个数平方的原因:不平方正负误差会抵消,对大误差更为敏感,在一些场景下更能凸显出模型预测的不准确性越接近于0,模型预测能力…

前端(三):Ajax

一、Ajax Asynchronous JavaScript And XML&#xff0c;简称Ajax&#xff0c;是异步的JavaScript和XML。 作用&#xff1a;数据交换&#xff0c;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互&#xff1a;可以在不重新加载整个页面的情况下&…

雷达气象学(2)——雷达电磁波的衰减

文章目录 2.1 衰减的概念2.2 气体对电磁波的衰减2.3 云对电磁波的衰减2.4 雨对电磁波的衰减2.5 雪对电磁波的衰减2.5.1 干雪对电磁波的衰减2.5.2 湿雪对电磁波的衰减 2.6 冰雹对电磁波的衰减 2.1 衰减的概念 衰减是电磁波能量沿传播路径减弱的现象。造成衰减的原因是当电磁波投…

8.9套题

A. 猴猴吃苹果 题意&#xff1a;给定根节点k&#xff0c;求访问点的顺序&#xff0c;使得每次从上一个点到当前点的权值最大。访问过的点权值为0。权值一样时&#xff0c;输出最小编号 思路&#xff1a;由于是双向边&#xff0c;先求根节点到每一个节点的距离值。在第一轮中&…

WPF篇(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)

WrapPanel控件&#xff08;瀑布流布局&#xff09; WrapPanel控件表示将其子控件从左到右的顺序排列&#xff0c;如果第一行显示不了&#xff0c;则自动换至第二行&#xff0c;继续显示剩余的子控件。我们来看看它的结构定义&#xff1a; public class WrapPanel : Panel {pub…

rocketMQ5.0事务消息实战

事务消息逻辑 首先我们来docker 部署rocketMQ与rocketMQDashBoard docker ps查看rocketMQ 容器名称 docker ps 进入容器内部 docker exec -it rmqnamesrv /bin/bash 创建事务消息 sh mqadmin updateTopic -c DefaultCluster -t TRANSACTIONTopic -n 127.0.0.1:9876 -a mes…