当前位置: 首页 > news >正文

[C语言] 函数详解:库函数与自定义函数


文章目录

  • 函数的概念
  • 库函数和自定义函数
    • 库函数
        • 使用库函数示例
        • 常用库函数及头文件
    • 自定义函数
        • 自定义函数的基本结构
        • 示例:实现两个数的求和函数
        • 自定义函数的好处
  • 函数的返回值
    • 有返回值的函数
    • 无返回值的函数
  • 函数的声明与调用
    • 声明函数
    • 在另一个文件中调用函数
        • 示例:使用外部函数
  • 总结

函数是编程语言中非常重要的概念,它用于组织代码和实现特定的功能。在C语言中,函数不仅能够提高代码的复用性,还能使程序更加结构化和易于维护。本篇博客将详细讲解C语言中的函数,包括 库函数自定义函数的使用、定义和调用方法,帮助读者深入理解C语言的函数概念。


函数的概念

在数学中,函数定义为通过一个变量的变化来影响另一个变量的变化。在C语言中,函数的概念与数学中的函数类似:一个函数接受参数(输入),经过一系列操作,返回结果(输出)。函数能够帮助我们将代码分成模块化的结构,使得代码的可读性和维护性大大提高。

在C语言中,函数是一段实现特定功能的代码块,可以反复调用。它通常包括三个要素:

  1. 函数名:用于标识函数并在需要时调用它。
  2. 形参(参数列表):用于接收调用函数时传入的实际参数。
  3. 函数体:包含实际执行的代码逻辑。

例如,数学函数 y = x + 1 可以理解为一个C语言的函数,x 是函数的参数,y 是返回值。


库函数和自定义函数

在C语言中,函数分为两类:

  • 库函数:C标准库中已经实现的函数,开发者可以直接使用。
  • 自定义函数:开发者自己编写的函数,用于实现特定功能。

库函数

库函数是C语言提供的预定义函数,开发者可以直接调用以完成某些通用的功能。这些库函数包含在头文件中,开发者需要在程序中通过 #include 指令来引入相关头文件。例如,printf 函数和 scanf 函数位于 stdio.h 头文件中。

使用库函数示例
#include <stdio.h>
#include <math.h>int main() {int a = 9;double result = sqrt(a);  // sqrt 是一个库函数,用于计算平方根printf("平方根是:%lf\n", result);return 0;
}

在上面的代码中:

  • sqrt 是一个库函数,用于计算传入数字的平方根。
  • 我们首先导入了 math.h 头文件,这是数学库函数的头文件,包含了 sqrt 函数。
常用库函数及头文件
库函数功能描述头文件
printf格式化输出stdio.h
scanf格式化输入stdio.h
sqrt计算平方根math.h
strlen计算字符串长度string.h
strcpy复制字符串string.h

自定义函数

自定义函数是开发者自己编写的函数。它可以根据实际需要实现特定功能,并且能够通过参数传递数据、返回计算结果。

自定义函数的基本结构
ret_type function_name(参数列表) {// 函数体,执行逻辑return 返回值;
}
  • ret_type:返回值类型,表示函数返回的值的数据类型。如果函数不返回值,使用 void
  • function_name:函数的名字,用于标识函数。
  • 参数列表:函数需要接收的参数,可以是多个,也可以没有参数。
  • return:返回函数的计算结果。
示例:实现两个数的求和函数
#include <stdio.h>// 自定义求和函数
double sum(double x1, double x2) {return x1 + x2;
}int main() {double result = sum(3.5, 2.5);  // 调用函数,传入实际参数printf("两数之和是:%lf\n", result);return 0;
}

在上面的代码中:

  • sum 函数用于计算两个浮点数的和,并返回结果。
  • main 函数中,我们调用了 sum 函数,并将 3.52.5 作为参数传递给函数。
自定义函数的好处
  1. 代码复用:同一个函数可以多次调用,避免重复代码。
  2. 简化代码:将复杂的逻辑封装在函数中,使得主程序更加简洁。
  3. 提高代码的可读性和可维护性

函数的返回值

函数的返回值是函数执行结束后返回给调用者的结果。返回值的类型可以是整型、浮点型、字符型等。

有返回值的函数

#include <stdio.h>int add(int a, int b) {return a + b;  // 返回两个整数的和
}int main() {int sum = add(5, 10);printf("两数之和是:%d\n", sum);return 0;
}
  • add 函数返回两个整数的和,返回值类型是 int

无返回值的函数

如果函数不需要返回值,可以将返回类型设置为 void

#include <stdio.h>void greet() {printf("Hello, World!\n");
}int main() {greet();  // 调用无返回值的函数return 0;
}

在上面的例子中,greet 函数不返回任何值,它只是打印一个字符串。


函数的声明与调用

声明函数

在 C 语言中,如果自定义函数的定义出现在 main 函数之后,则需要在 main 函数之前声明该函数。这是因为 C 语言是自上而下执行的,在使用函数之前,必须告知编译器函数的存在。

#include <stdio.h>// 声明函数
double sum(double x1, double x2);int main() {printf("两数之和是:%lf\n", sum(5.5, 4.5));return 0;
}// 定义函数
double sum(double x1, double x2) {return x1 + x2;
}

在上面的代码中,我们在 main 函数之前声明了 sum 函数,并在后面实现了它。

在另一个文件中调用函数

C 语言支持在多个 .c 文件中组织代码。在大型项目中,通常将函数的实现放在一个单独的文件中,而在另一个文件中进行调用。这时,需要用 extern 关键字来声明外部函数。

示例:使用外部函数

假设我们有两个文件 functions.cmain.c

functions.c(定义函数):

#include <stdio.h>double sum(double x1, double x2) {return x1 + x2;
}

main.c(调用函数):

#include <stdio.h>// 声明外部函数
extern double sum(double x1, double x2);int main() {double result = sum(5.3, 7.2);printf("两数之和是:%lf\n", result);return 0;
}

通过这种方式,我们可以将函数的定义和使用分离,便于代码的维护和扩展。


总结

本篇博客详细讲解了C语言中库函数自定义函数的使用方法,并介绍了函数的声明、返回值、参数传递等相关概念。通过库函数,我们可以快速使用C语言标准库提供的功能,而自定义函数则可以帮助我们封装特定的逻辑,提升代码的复用性和可读性。

相关文章:

[C语言] 函数详解:库函数与自定义函数

文章目录 函数的概念库函数和自定义函数库函数使用库函数示例常用库函数及头文件 自定义函数自定义函数的基本结构示例&#xff1a;实现两个数的求和函数自定义函数的好处 函数的返回值有返回值的函数无返回值的函数 函数的声明与调用声明函数在另一个文件中调用函数示例&#…...

0x11 科迈 RAS系统 Cookie验证越权漏洞

参考: 科迈 RAS系统 Cookie验证越权漏洞 | PeiQi文库 (wgpsec.org)免责声明 欢迎访问我的博客。以下内容仅供教育和信息用途: 合法性:我不支持或鼓励非法活动。请确保遵守法律法规。信息准确性:尽管我尽力提供准确的信息,但不保证其完全准确或适用。使用前请自行验证。风…...

MoonBit 双周报 Vol.57:AI助手功能增强、表达式优先级调整、JS 交互优化、标准库与实验库API多项更新!

2024-10-08 IDE更新 AI Codelens支持 /generate 和 /fix 命令 /generate 命令能够提供一个通用的用以生成代码的聊天界面。 /fix 命令能够读取当前函数的错误信息给出修复建议。 MoonBit更新 调整中缀表达式和if、match、loop、while、for、try表达式的优先级, 后者这些控制…...

element ui input textarea控制显示高度

样式代码 .testPage { position: absolute; left: 0; top: 0; right: 0; bottom: 0; display: flex; height: 100%; /* 控制输入框高度 */ .el-textarea { height: 90%; ::v-deep .el-textarea__inner { height: 90%; } } }...

Chromium 中chrome.downloads扩展接口c++

一、前端chrome.downloads 使用 chrome.downloads API 以编程方式启动、监控、操作和搜索下载内容。 权限 downloads 您必须在扩展程序清单中声明 "downloads" 权限&#xff0c;才能使用此 API。 {"name": "My extension",..."permiss…...

微信小程序常见问题

一、编译报错 [ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json 解决办法&#xff1a; 微信开发者工具中打开设置->安全设置->打开服务端口用HBuilder X打开小程序文件夹&#xff0c;点击“运行到小程序模拟器”&#xff0c;生成配置文件&#xff0c;…...

进程的理解

进程的理解 目录&#xff1a; 什么是进程主要特征主要组成部分进程状态进程优先级 1.什么是进程 概念&#xff1a; 在操作系统中&#xff0c;**进程&#xff08;Process&#xff09;**是一个正在执行的程序实例。可以将进程理解为一个动态的实体&#xff0c;它不仅包括静态…...

LeetCode494:目标和

题目链接&#xff1a;494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution { public:int findTargetSumWays(vector<int>& nums, int target) {int sum 0;for(int i 0; i < nums.size(); i){sum nums[i];}if(abs(target) > sum)…...

vue3中自定义校验函数密码不生效问题

vue3中自定义校验函数密码不生效问题 由于在自定义的校验规则中只校验了有数据的情况&#xff0c;以至于在没输入时&#xff0c;校验不生效 &#xff08;1&#xff09;用户不输入校验不生效 const validateSurePassword (rule, value, callback) > {if (value ! ) {if (…...

RabbitMQ(死信队列)

一、本文抒写背景 前面我也在延迟队列篇章提到过死信队列&#xff0c;也提到过一些应用场景&#xff01; 今天呢&#xff0c;这篇文章&#xff0c;主要就是实战一个业务场景的小Demo流程&#xff0c;哈哈&#xff0c;那就是延迟关闭订单。 二、开始啦&#xff01;letgo! 首…...

HTTP代理的优点和局限性

在这个信息爆炸的时代&#xff0c;网络已成为我们获取知识、交流思想、开展商务的重要平台。但随之而来的隐私泄露、网络安全威胁、以及无处不在的网络监控&#xff0c;却让我们的每一次在线活动都充满了风险。 在这样的背景下&#xff0c;HTTP代理技术应运而生&#xff0c;它不…...

大厂面试真题-如果通过JVM自带的工具排查和解决线上CPU100%的问题

通过JVM自带的工具去定位和解决线上CPU 100%的问题&#xff0c;可以遵循以下步骤&#xff1a; 一、使用top和jps定位Java进程 使用top命令&#xff1a; 在Linux服务器上执行top命令&#xff0c;查看所有进程的CPU使用情况。找到CPU使用率最高的进程&#xff0c;并记录其PID&a…...

kubernetes中微服务部署

微服务 问&#xff1a;用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 答&#xff1a;需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service&#xff0c;应用可以实现服务发现和负载均衡Service 默认只…...

基于 Java 的天气预报系统设计与实现

随着互联网的飞速发展&#xff0c;天气预报系统变得越来越重要。它可以帮助用户了解未来几天的天气情况&#xff0c;便于出行、活动安排。本文将介绍如何使用 Java 构建一个简单的天气预报系统&#xff0c;涉及系统架构设计、核心功能开发以及完整的代码实现。 1. 系统架构设计…...

思迅商云8前台打开提示上传日志信息失败

请按照以下步骤核实处理&#xff1a; 1、重启sql服务后测试。 2、请先备份前台安装目录&#xff0c;之后删除安装目录下的log文件和localdate下的log文件&#xff0c;之后重新打开软件&#xff0c;若依旧不行则说明前台文件有损坏&#xff0c;需要重新安装客户端&#xff0c;…...

webstorm的缩进设置(过度缩进解释)

在编写前端代码时 缩进规范一般被认为是2个空格 而非默认的4个空格 当我们通过webstorm去编写前端代码时 我们可以通过setting->Code Style->html/css/js指定的界面中去设置tab/indent/continuation indent 具体的话 我们将html/css/js操作界面中的tab/indent设置为2个空…...

与ZoomEye功能类似的搜索引擎还有哪些?(渗透课作业)

与ZoomEye功能类似的搜索引擎有&#xff1a; Shodan&#xff1a;被誉为“物联网的搜索引擎”&#xff0c;专注于扫描和索引连接到互联网的各种设备&#xff0c;如智能家居设备、工业控制系统、摄像头、数据库等。它提供全球互联网设备的可视化视图&#xff0c;帮助用户了解网络…...

Java 计数排序

计数排序&#xff08;Counting Sort&#xff09;是一种非比较型排序算法&#xff0c;适用于一定范围内的整数排序。它的基本思想是通过计数输入元素中每个值出现的次数&#xff0c;然后计算每个值的起始位置&#xff0c;最终将元素放到正确的位置上。计数排序的时间复杂度为 O(…...

error: RPC failed; curl 16 Error in the HTTP2 framing layer

yschai@LAPTOP-F2L146JK:~$ git clone https://github.com/Chyusen/yschai.git Cloning into ‘yschai’… error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush after ref listing 使用Ubuntu在git clone github上的项目的时候,遇到以上报错…...

Python脚本分类和代码举例

Python是一种强大且灵活的编程语言&#xff0c;被广泛应用于数据分析、Web开发、自动化、人工智能等领域。在不同的应用场景下&#xff0c;Python脚本可以被分类为多种类型。本文将深入分析Python脚本的分类&#xff0c;同时提供相关代码示例&#xff0c;帮助读者理解和应用这些…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...