用函数实现模块化程序设计二

news/2024/11/14 5:04:09/文章来源:https://www.cnblogs.com/EricsT/p/18540390

调用函数

定义函数的目的是为了调用此函数,以得到预期的结果。因此,应当熟练掌握调用函数的方法和有关概念

函数调用的形式

函数调用的一般形式为:

函数名(实参表列)

如果是调用无参函数,则“实参表列”可以没有,但括号不能省略

如果实参表列包含多个实参,则各个参数之间用逗号隔开

按函数调用在程序中出现的形式和位置来分,可以有以下三种函数调用的方式:

  1. 函数调用语句
  2. 函数表达式
  3. 函数参数

函数调用语句

把函数调用单独作为一个语句

此时不要求函数带回值,只要求函数完成一定的操作

函数表达式

函数调用出现在另一个表达式中

此时要求函数带回一个确定的值可以参加表达式的运算

函数参数

函数调用作为另一个函数调用时的实参

调用函数并不一定要求包括分号,只有作为函数调用语句才需要有分号。如果作为表达式或者函数参数,函数调用本身是不必有分号

函数调用时的数据传递

形式参数和实际参数

在调用有参函数时,主调函数和被调函数之间有数据传递关系。在定义函数时函数名后面括号中的变量名称为“形式参数”(简称“形参”)或“虚拟参数”。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”(简称“实参”)。实际参数可以是常量、变量或表达式

实参和形参间的数据传递

在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算

在调用函数过程中发生的实参与形参间的数据传递,通常称为“虚实结合”

实参可以是常量、变量或表达式;实参与形参的类型应相同或赋值兼容

函数调用的过程

  • 在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数的形参被临时分配内存单元
  • 将实参对应的值传递给形参
  • 执行被调函数
  • 通过 return 语句将函数值带回到主调函数,如果函数不需要返回值,则不需要 return 语句,这时函数应定义为 void 类型
  • 调用结束,形参单元被释放。注意:实参单元仍保留并维持原值,没有改变。如果在执行一个被调函数时,形参的值发生改变,不会改变主调函数的实参的值。这是因为实参和形参是两个不同的存储单元

实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能由形参传给实参

实参和形参在内存中内有不同的存储单元,实参无法得到形参的值

函数的返回值

通常,希望通过函数调用使主调函数得到一个确定的值,这就是函数值(函数的返回值)

函数的返回值是通过函数中的 return 语句获得的,return 语句将被调用函数中的一个确定值带回一个函数值(供主调函数使用)被调用函数中必须包含一个 return 语句。如果不需要从被调函数带回函数值可以不要 return 语句

一个函数中可以有一个以上的 return 语句,执行到哪一个 return 语句,哪一个 return 语句就起作用。return 语句后面的括号可以不要,return 后面的值可以是一个表达式

函数值的类型,既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型

在定义函数时指定的函数类型一般应该和 return 语句中的表达式类型一致

如果函数值的类型和 return 语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换,即函数类型决定返回值的类型

对于不带回值的函数,应当用定义函数为“void 类型”(或称“空类型”)这样,系统就保证不使函数带回任何值,即禁止在调用函数中使用被调用函数的返回值。此时在函数体中不得出现 return 语句

对被调用函数的声明和函数原型

在一个函数中调用另一个函数(即被调用函数)需要具备如下条件:

  1. 首先被调用的函数必须是已经定义的函数(是库函数或者用户自己定义的函数)
  2. 如果使用库函数,应该在本文件开头用 #include 指令将调用有关库函数时所需用到的信息“包含”到本文件中来
  3. 如果使用用户自己定义的函数,而该函数的位置在调用它的函数(即主调函数)的后面(在同一个文件中),应该在主调函数中对被调函数作声明。声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法

函数的声明和函数定义的第一行(函数首部)基本上是相同的,只差一个分号(函数声明比翻书定义中的首行多一个分号)因此写函数声明时,可以简单的照写已定义的函数的首行,再加上一个分号,就成了函数的“声明”函数的首行(即函数的首部)称为函数原型

使用函数的首部作为函数声明是为了便于对函数调用的合法性进行检查。因为在函数的首部包含了检查嗲用函数是否合法的基本信息(包括了函数名、函数值类型、参数个数、参数类型和参数顺序)

在检查函数调用时要求函数名、函数类型、参数个数和参数顺序必须与函数声明保持一致,实参类型必须与函数声明中的形参类型相同(或赋值兼容,如实型数据可以传递给整型形参,按赋值规则进行类型转换)否则就按出错处理。这样子就能保证函数的正确调用

使用函数原型作声明是 C 的一个重要特点。用函数原型来声明函数,能减少编写程序中可能出现的错误。由于函数声明和位置与函数调用语句的位置比较近,因此在写程序时便于就近参照函数原型来书写函数调用,不易出错

实际上,在函数声明中的形参名可以省写,而只写形参的类型

编译系统之关心和检查参数个数和参数类型,而不检查参数名,因为在调用函数时只要求保证实参类型与形参类型一致而不必考虑形参名是什么。因此在函数声明中,形参名可写可不写,形参名是什么都无所谓

函数原型的一般形式有两种:

函数类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ... , 参数类型n 参数名n);

函数类型 函数名(参数类型1, 参数类型2, ... , 参数类型n);

对函数的“定义”和“声明”不是同一回事。函数的定义是指对函数功能的确立,包括指定函数名、函数值类型以及形参及其类型以及函数体等,它是一个完整的、独立的函数单位。而函数声明的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(如函数名是否正确,实参与形参类型和个数是否一致),它不包括函数体

如果已在文件的开头(在所有函数之前)已对本文件中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再作声明

由于在文件的开头(在函数的外部)已对要调用的函数进行了声明(这些称为“外部的声明”)因此在程序编时,编译系统已从外部声明中知道了函数的有关信息,所以不必再主调函数中再重复进行声明。写在所有函数前面的外部声明在整个文件范围内有效

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HyperWorks使用六面体和三棱柱单元进行实体网格剖分

本节将演示如何使用 solid map 功能对一个复杂的几何实体进行网格剖分。剖分的思路是:首先对该实体进行适当的切割,以使其各个部分均处于 mappable 的状态;然后分别对各个子块进行 solid map 剖分。事实上,针对同一个几何实体,可能有多种分块方案。究竟哪种方案能获得更高…

SQLSever将csv文件中的数据导入数据库中的某个表中的操作以及可能会出现的报错

注:导入数据前,检查一下数据类型是否与数据库中的数据类型相匹配 第一种方法: 首先打开SQLSever数据库,右击你的数据库找到任务后点开导入平面文件,如图 在弹开的窗口中点击下一步 接下来 填写完后点击下一步,跳转到预览数据的页面,会显示出表中的前20条数据,在检查没有…

云消息队列 Kafka 版全面升级:经济、弹性、稳定,成本比自建最多降低 82%

本文整理于 2024 年云栖大会阿里云智能集团产品专家张凤婷带来的主题演讲《云消息队列 Kafka 版全面升级:经济、弹性、稳定》作者:娜米 本文整理于 2024 年云栖大会阿里云智能集团产品专家张凤婷带来的主题演讲《云消息队列 Kafka 版全面升级:经济、弹性、稳定》 云原生消息…

Java定时任务大盘点:发工资也能“指日可待”

作者:京东保险 孙昊宇 引子:“指日可待”让我们先从一个成语开始,“指日可待”。没错,我说的就是定时任务😏。“指日可待”: 为任务指定好日程,就可以安心等待任务执行。在实际场景中,我们往往需要在特定时间做某件事情,或以某个时间间隔重复某件事情,如定期备份数据…

B端体验深耕-洞察用户需求,打造心有灵犀的使用体验

作者:京东科技 程跃宇前言 我们常以“心有灵犀”来形容与合作伙伴的默契配合,若我们的产品能与用户达到同样的默契,将极大地提升用户在任务旅程中的流畅体验。 在B端体验设计领域,我们深知用户对我们产品的期待───快速完成任务、即用即走;然而,随着业务需求和产品功能…

YLCTF RE

Round1 [Round 1] xor kail upx脱壳,一眼顶针,xor v5 = [0x45, 0x50, 0x5f, 0x48, 0x5a, 0x67, 0x7f, 0x2d, 0x2b, 0x7e, 0x24, 0x78, 0x2c, 0x24, 0x31, 0x2c, 0x7e, 0x78, 0x24,0x31, 0x28, 0x2d, 0x7a, 0x7d, 0x31, 0x7e, 0x25, 0x79, 0x2b, 0x31, 0x29, 0x79, 0x2a, 0x2f…

RAG应用性能优化全景图:从查询到生成的6个关键阶段

引言 检索增强生成(Retrieval-Augmented Generation,RAG)技术已成为大语言模型(LLM)应用开发中的关键组成部分。然而,构建高效、准确的RAG系统仍然面临诸多挑战。本文将深入探讨RAG开发的6个关键阶段,并分析每个阶段的优化策略,为开发者提供全面的性能优化指南。 RAG开…

html 空白汉字占位符

符号表示  英文半角空格不换行  英文半角空格不换行  中文全角空格  半角空格  半角空格  全角空格  全角空格  四分之一全角空格  英文半角空格连续的 会在同一行内…

ABB机器人维修IRC5控制器结构剖析

"【ABB机器人维修IRC5控制器性能低】——描述:控制器性能低,并且似乎无法正常工作。ABB机器人控制柜没有完全 “ 死机 ”。——后果:可能会观察到这些症状:程序执行迟缓,看上去无法正常执行并且有时停止。——可能的原因:计算机系统负载过高,可能因为以下其中一个或…

《Django 5 By Example》阅读笔记:p17-p53

《Django 5 By Example》学习第2天,p17-p53总结,总计37页。 一、技术总结 1.数据库迁移 python manage.py makemigrations blog python manage.py sqlmigrate blog 0001 python manage.py migrate 2.ORM Django自带ORM。 3.view (1)定义 p42, A Django view is just a Python…

CentOS虚拟机无法查看ipv4地址

CentOS默认没有开启ens33 vi /etc/sysconfig/network-scripts/ifcfg-ens33将最后一行的ONBOOT=no修改为ONBOOT=yes 重启网卡服务 systemctl restart network然后 ip addr 查看ip目前这个是动态ip 如果要静态ip 继续编辑网卡配置文件ifcfg-ens33,将BOOTPROTO=dhcp修改为BOOTPRO…

人工智能是这样理解“情绪”的

前一篇:《人工智能模型训练:从不同格式文件中读取训练数据集》 前言:在前面的内容中,我们经常提到“特征”,那么如何表示特征呢?举个例子,在日常生活中,我们描述一个快递包装盒时可能会提到它的高度、宽度和深度(这三个值就是盒子的特征,当然也可以用颜色、重量、材料…