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

7.2 怎样定义函数

 7.2.1 为什么要定义函数

 主要内容:

为什么要定义函数

C语言要求所有在程序中用到的函数必须“先定义,后使用”。这是因为在调用一个函数之前,编译系统需要知道这个函数的名字、返回值类型、功能以及参数的个数与类型。如果没有事先定义,编译系统将无法知道这个函数是什么,要实现什么功能,从而无法执行这个函数。

例如,如果想用max函数来求两个数中的较大者,必须事先按规范对它进行定义。这样,当程序执行max时,编译系统就会按照定义时所指定的功能执行。

定义函数应包括的内容

定义函数时,应该包括以下几个内容:

  1. 函数名字:以便以后按名调用。
  2. 函数类型:即函数返回值的类型。
  3. 参数的名字和类型:以便在调用函数时向它们传递数据。对无参函数不需要这项。
  4. 函数功能:即函数应当完成什么操作,这是最重要的,是在函数体中解决的。

库函数

C编译系统提供了一些库函数,这些库函数是由编译系统事先定义好的,包含在库文件中。程序设计者不必自己定义这些库函数,只需要通过#include指令把有关的头文件包含到本文件模块中即可。例如,如果在程序中用到数学函数(如sqrtfabssincos等),就必须在本文件模块的开头写上:

#include<math.h>

这些库函数只提供了最基本、最通用的一些函数。对于库函数中没有提供的函数,程序设计者需要在程序中自己定义。

 7.2.2 定义函数的方法

主要内容:

这段文字描述了在C语言(或类似的编程语言)中定义函数的不同方法。以下是各部分的概述:

### 1. 定义无参函数
无参函数是没有输入参数的函数。它们由`void`关键字声明,表明这个函数不返回值。例子包括`print_star`和`print_message`函数。以下是定义无参函数的一般形式:

类型名 函数名()
函数体
或


类型名 函数名(void)

函数体

### 2. 定义有参函数
有参函数接受一个或多个参数。以下是有参函数的例子,该函数返回两个整数中的最大值:

int max(int x, int y)
{int z;z = x > y ? x : y;return(z);
}


定义有参函数的一般形式为:

类型名 函数名(形式参数列表)
函数体

### 3. 定义空函数
空函数不执行任何操作。它们通常用于占位,预留空间以便未来实现某些功能。以下是定义空函数的形式:

void dummy()
{}


调用空函数不会执行任何操作。例如,在程序设计中,可以使用空函数来占用一个位置,预留未来扩充的功能,当功能实现时,再替换为空函数。

### 总结
这三种定义函数的方法分别应用于不同的场景。无参函数通常用于不需要输入并且不返回值的情况。有参函数可以处理输入参数并返回值。空函数主要用作占位符,为未来的功能扩展提供便利。这些方法结合使用,可以创建出结构清晰、可读性好且方便扩展的程序。

 

总结:

在C语言中,定义函数是一个核心概念,它涉及到以下几个重点、难点和易错点:

### 重点
1. **函数声明和定义**:
   - 函数声明:声明函数的返回类型、函数名和参数类型。
   - 函数定义:包含函数的实际代码和逻辑。
   - 函数原型:是函数声明的一部分,用于告知编译器函数的签名。

2. **返回类型**:
   - 每个函数都有一个返回类型,指定了函数返回值的数据类型。
   - 若函数不返回值,使用`void`作为返回类型。

3. **参数列表**:
   - 函数可以有参数,通过参数列表定义。
   - 参数可以是任何数据类型,并且可以有任意数量的参数。

### 难点
1. **作用域**:
   - 理解局部变量与全局变量的作用域及其可见性。
   - 全局变量对所有函数可见,而局部变量仅在定义它的函数内可见。

2. **参数传递**:
   - 理解值传递与引用传递的区别。
   - 在C语言中,函数参数默认是通过值传递,即传递变量的拷贝,函数内的操作不会影响原变量。

3. **递归**:
   - 递归是一种函数调用自身的技术。
   - 正确使用递归需要正确的基本情况和递归情况,以避免无限递归。

### 易错点
1. **函数声明和定义的混淆**:
   - 函数声明没有函数体,而函数定义有。
   - 函数应该在被调用之前被声明或定义,以免出现“implicit declaration”警告。

2. **参数类型和数量的不匹配**:
   - 调用函数时,实参的类型和数量必须与形参匹配。
   - 不匹配可能导致编译错误或未定义的行为。

3. **返回类型不匹配**:
   - 函数的实际返回值必须匹配其声明的返回类型。
   - 若函数声明为`void`,则不能返回值;若声明为其他类型,必须返回该类型的值。

4. **忘记返回值**:
   - 若函数有非`void`的返回类型,忘记返回值会导致编译器警告,并可能返回未定义的值。

5. **递归深度**:
   - 如果递归函数没有正确的终止条件,或者递归深度太大,将导致堆栈溢出。### 示例

 


// 函数声明
int max(int a, int b);// 函数定义

int max(int a, int b) {return a > b ? a : b;
}

在编写C语言函数时,务必注意以上的重点、难点和易错点,以避免常见的错误和问题。

相关文章:

7.2 怎样定义函数

7.2.1 为什么要定义函数 主要内容&#xff1a; 为什么要定义函数 C语言要求所有在程序中用到的函数必须“先定义&#xff0c;后使用”。这是因为在调用一个函数之前&#xff0c;编译系统需要知道这个函数的名字、返回值类型、功能以及参数的个数与类型。如果没有事先定义&…...

Chrome扩展V2到V3的变化

Chrome扩展manifest V3变化、升级迁移指南_chrome_ZK645945-华为云开发者联盟 (csdn.net) 1.background //V2 "background": "background.js"//V3 "background": {"service_worker": "background.js"} 2.executeScript …...

lock、tryLock、lockInterruptibly有什么区别?

lock、tryLock 和 lockInterruptibly 都是用于线程同步的方法,但它们有不同的行为和用途: lock() 方法:lock() 方法是 Java 中 Lock 接口定义的一部分,它用于获取锁并阻塞当前线程,直到锁可用为止。如果锁当前被其他线程占用,lock() 方法会导致当前线程阻塞,直到锁被释放…...

mysql面试题5:索引、主键、唯一索引、联合索引的区别?什么情况下设置了索引但无法使用?并且举例说明

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说索引、主键、唯一索引、联合索引的区别? 索引、主键、唯一索引和联合索引是数据库中常用的索引类型,它们有以下区别: 索引:索引是一种数…...

数据集笔记:纽约花旗共享单车od数据

花旗共享单车公布的其共享单车轨迹数据&#xff0c;包括2013年-2021年曼哈顿、布鲁克林、皇后区和泽西城大约14500辆自行车和950个站点的共享单车轨迹数据 数据地址&#xff1a;Citi Bike System Data | Citi Bike NYC | Citi Bike NYC 性别&#xff08;0未知&#xff1b;1男&…...

为什么 0.1+0.2 不等于 0.3

为什么 0.10.2 不等于 0.3 在 JavaScript 中&#xff0c;0.1 0.2 的结果不等于 0.3&#xff0c;这是因为在 JavaScript 中采用的是双精度浮点数格式&#xff08;64 位&#xff09;&#xff0c;而在这种格式下无法精确表示某些小数&#xff0c;因此在进行计算时会出现精度误差。…...

huggingface_hub v0.17 现已发布

InferenceClient 现在支持所有任务&#xff01;&#x1f4a5;&#xff0c;感谢社区的巨大努力&#xff0c;新添加的任务包括&#xff1a; 对象检测文本分类Token 分类翻译问题回答表格问题回答填充掩码表格分类表格回归文档问题回答视觉问题回答零样本分类 这些方法还支持使用 …...

机器学习——一元线性回归构造直线,并给出损失函数

目 录 Question 问题分析 1.概念补充 2.流程分析 3.注意 具体实现 最终成果 代码 思考&#xff1a; Question 在二维平面有n个点&#xff0c;如何画一条直线&#xff0c;使得所有点到该直线距离之和最短 如果能找到&#xff0c;请给出其损失函数 问题分析 1.概念…...

OpenHarmony自定义组件介绍

一、创建自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑…...

云原生之使用Docker部署PDF多功能工具Stirling-PDF

云原生之使用Docker部署PDF多功能工具Stirling-PDF 一、Stirling-PDF介绍1.1 Stirling-PDF简介1.2 Stirling-PDF功能 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Stirli…...

B树和B+树的介绍和对比,以及MySQL为何选择B+树

在计算机科学中&#xff0c;B树和B树是常用的数据结构&#xff0c;用于在大规模数据集上进行高效的插入、删除和查找操作。它们在数据库管理系统、文件系统等许多实际应用中发挥着重要作用。本文将深入介绍B树和B树的结构特点、实际应用方面以及它们的优缺点&#xff0c;并最后…...

MD5 绕过第一式:弱比较绕过

文章目录 参考环境MD5韧性脆弱性md5() 隐式类型转换字符串连接数学运算布尔判断相等运算符 科学计数法科学计数法前缀 0E 与 0e PHP8 与 PHP 其他版本下字符串转化为数值的具体规则PHP8数值字符串优化 其他版本更为详细的讲解 字符串与字符串的弱比较字符串与数值的弱比较0e215…...

红黑树是如何实现的?

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …...

实验室没人导该怎么办

实验室没人教该怎么办 Q: 国内top5高校研一,课题开始老板就给了一个大方向,之后怎么做实验都是自己看文献研究的,终于开始动手做实验,才发现别人根本不想管你,宁愿抱着电脑看剧也不想教你,十分焦虑,该怎么办? A: 按照大多数实验室的惯例,老板一定会指派一个小老板…...

pytest简明教程

1. 简介 pytest是一款基于Python的测试框架。与Python自带的unittest相比&#xff0c;pytes语法更加简洁&#xff0c;断言更加强大&#xff0c;并且在自动测试以及插件生态上比unittest都要更加强大。 1.1. 安装pytest pip install pytest1.2. pytest命名规则 pytest默认会…...

解决方案:解决https页面加载http资源报错

HTTPS页面加载HTTP资源会报错的原因是出于安全性考虑。 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种通过使用SSL/TLS加密通信来保护数据传输的协议&#xff0c;它确保了客户端和服务器之间的安全连接。 当HTTPS页面尝试加载非加密的HTTP资源时&a…...

嵌入式开源库之libmodbus学习笔记

socat 安装sudo apt-get install socat创建终端 socat -d -d pty,b115200 pty,b115200查看终端 ls /dev/pts/ minicom 安装 sudo apt-get install minicom链接虚拟终端 sudo minicom -D /dev/pts/3以十六进制显示 minicom -D /dev/pts/1 -H设置波特率 minicom -D /dev/pts/1…...

Spring MVC 中的数据验证技术

一、前言 在Web开发中&#xff0c;数据验证是不可或缺的一部分。Spring MVC 框架提供了强大的数据验证支持&#xff0c;可以帮助我们轻松地对用户提交的数据进行验证。 二、实现 Spring MVC 使用 JSR-303 验证规范&#xff08;Hibernate Validator 是其参考实现&#xff09;…...

windows 修改hosts映射,可以ping通,但是无法通过http url 路径访问,出现 500 Internal Privoxy Error

问题描述 今天在学习nginx时&#xff0c;想在hosts配置一个nginx的域名映射&#xff0c;但是发现访问nginx服务的ip时可以访问通&#xff0c;在dos命令窗口ping配置的域名映射也可以ping通&#xff0c;但是一旦在浏览器通过http请求访问配置的hosts域名映射时却出现 500 Inter…...

如何将图片转为ico格式

这里主要是记录一个网站&#xff0c;如果你有更好的办法欢迎留言~ ico简介 ICO&#xff08;Icon&#xff09;是一种用于表示图标的文件格式&#xff0c;常用于Windows操作系统中。ICO格式的图片通常用于表示应用程序、文件夹、网站等的图标。 ICO文件可以包含多个图标&#x…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...