当前位置: 首页 > 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…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...