(delphi11最新学习资料) Object Pascal 学习笔记---第4章第1节(过程和函数)

第4章 过程与函数

​ Object Pascal 语言(以及 C 语言的类似功能)强调的另一个重要思想是例程的概念,例程基本上是一系列具有唯一名称的语句,可以多次调用。例程(或函数)通过名称来调用,这样就可以避免重复编写相同的代码,并允许在整个程序的多个地方使用某些代码的单一版本。从这个角度看,你可以将例程视为一种基本的代码封装机制。

4.1 过程和函数

​ 在Object Pascal中,例程可以有两种形式:过程和函数。理论上,过程是您要求计算机执行的操作,而函数是返回值的计算。这种区别强调了函数有一个结果、返回值或类型,而过程则没有。C语言语法只提供了函数这一种机制。而在C语言中,过程就是一个结果为 void(或 null)的函数。

​ 这两种例程都可以有多个指定数据类型的参数。正如我们稍后将看到的,过程和函数也是类方法的基础,在这种情况下,两种形式之间的区别依然存在。事实上,与 C、C++、Java、C# 或 JavaScript 不同,在声明例程或方法时,您需要使用这两个关键字(procedure和function)之一。

​ 实际上,即使有两个独立的关键字,函数和过程之间的区别也非常有限:你可以调用函数来执行某些任务,然后忽略结果(可能是一个可选的错误代码或类似的东西),或者调用存储过程,在其中一个参数中传回一个结果(本章稍后将详细介绍引用参数)。

​ 以下是使用Object Pascal语言语法定义过程的示例,使用了procedure关键字,该示例属于FunctionTest项目:

procedure Hello;
beginShow('Hello world!');
end;

​ 作为比较,这是使用C语言语法编写的相同函数,它没有关键字,即使没有参数也需要括号,并且有一个void关键字表示没有返回结果:

void Hello()
{Show("Hello world!");
};

​ 实际上在C语言语法中,过程和函数之间没有区别。然而,在Pascal语言语法中,对函数进行了区分,因为函数有一个特定的关键字(function),并且必须有一个返回值(或返回类型)。

注解: Object Pascal与其他语言之间还有一个非常特殊的语法差异,那就是在定义中函数或过程签名的末尾,begin 关键字之前有一个分号。

​ 有两种方法来表示函数调用的结果,一种是将值赋值给函数的名称,另一种是使用Result关键字:

/ 经典的Pascal风格
function DoubleOld(Value: Integer): Integer;
beginDoubleOld := Value * 2;
end;// 现代的替代方式
function DoubleIt(Value: Integer): Integer;
beginResult := Value * 2;
end;

注解: 与经典的Pascal语法不同,现代Object Pascal实际上有三种表示函数结果的方法,包括在本章“带有结果的Exit”部分中讨论的Exit机制。

​ 使用Result而不是函数名称来表示函数的返回值是最常见的语法,使代码更易读。使用函数名称是一种经典的Pascal标志,现在很少使用,但仍然受到支持。

​ 同样,通过比较,同样的函数使用C语言语法可以这样写:

int DoubleIt(int Value)
{return Value * 2;
};

注解: 在基于C语法的语言中,return语句表示函数的结果,但也终止执行,将控制权返回给调用者。另一方面,在Object Pascal中,向函数的结果赋值不会终止函数执行。这就是为什么结果通常被用作常规变量的原因,例如为其分配初始默认值,甚至在算法中修改其结果。同时,如果需要停止执行,还需要使用Exit或其他流控制语句。所有这些在以下“带有结果的Exit”部分中都有更详细的介绍。

​ 如果这些例程是这样定义的,那么调用语法就相对简单,只需输入标识符,然后在括号内输入参数即可。在没有参数的情况下,可以省略空括号(与基于C语法的语言不同)。以下代码片段以及接下来的几个代码片段都是本章FunctionsTest项目的一部分:

// 调用过程
Hello;// 调用函数
X := DoubleIt(100);
Y := DoubleIt(X);
Show(Y.ToString);

​ 这里演示了代码封装的概念。当您调用DoubleIt函数时,您无需知道用于实现它的算法。如果以后找到了更好的方法来使数字加倍,您可以轻松更改函数的代码,但调用代码将保持不变(尽管执行函数可能会变得更快)。

​ 相同的原则也可以应用于Hello过程:我们可以通过更改此过程的代码来修改程序的输出,而主程序代码将自动更改其效果。以下是如何更改过程实现代码的方式:

procedure Hello;
beginShow('Hello world, again!');
end;

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

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

相关文章

基于链表实现贪吃蛇游戏

本文中,我们将使用链表和一些Win32 API的知识来实现贪吃蛇小游戏 一、功能 (1)游戏载入界面 (2)地图的绘制 (3)蛇身的移动和变长 (4)食物的生成 (5&…

阿里云盘分享多文件方法

1、单次分享不超过100个文件/文件夹 2、分享的文件夹目录不超过15个子文件夹层级 3、文件夹里面的总文件数量不能超过4000个 其实限制的条件蛮高的,但是对于这么大容量的网盘,稍微一分享就会超过条件限制,有的人会拆分为好几个文件多次分享&a…

CentOS 7 部署 ZeroTier Moon 节点

ZeroTier是一套使用UDP协议构建的SD-WAN网络软件,其主要有三部分组成:行星服务器Planet、月亮服务器Moon、客户端节点LEFA,行星服务器是ZeroTier的根节点,可以采用ZeroTier官方的服务器,也可以使用开源代码自行搭建 月…

基于python的城市旅游数据采集分析系统

基于python的城市旅游数据采集分析系统 "A Python-based City Tourism Data Collection and Analysis System" 下载链接:基于python的城市旅游数据采集分析系统 目录 目录 2 摘要 3 关键词 4 第一章 引言 4 1.1 研究背景 4 1.2 国内外研究现状 5 1.3 研究…

sql注入之union联合注入

一、Union注入 联合查询注入是联合两个表进行注入攻击,使用关键词 union select 对两个表进行联合查询。两个表的字段数要相同,不然会出现报错。列数相同 union 特性是显示两张表 我们就可以吧第一个参数变为------负--的 或者不存在的值 就行了 显示就…

JAVA处理类似饼状图占比和100%问题,采用最大余额法

前言: 在做数据统计报表的时候,有两种方式解决占比总和达不到100%或者超过100%问题。 第一种方式是前端echart图自带的算分框架。 第二种方式是java后端取处理这个问题。 现存问题: 前端通过饼状图的方式去展示各个分类的占比累加和为100%问题…

公司宣传电子画册的制作方法

​制作公司宣传电子画册是一种非常有效的方式,可以展示公司的形象和产品,同时也可以吸引更多的潜在客户。不仅低碳环保,还省了不少人力和财力,只要一个二维码、一个链接就能随时随地访问公司的宣传画册。以下是一些制作电子画册的…

Jmeter学习系列之三:测试计划详细介绍

目录 前言 步骤1:启动JMeter窗口 步骤2:添加/删除测试计划元素 步骤3:加载并保存测试计划元素。 步骤4:配置树元素 步骤5:保存JMeter测试计划 步骤6:运行JMeter测试计划

TSINGSEE青犀视频智慧电梯管理平台,执行精准管理、提升乘梯安全

一、方案背景 随着城市化进程的不断加快,我国已经成为全球最大的电梯生产和消费市场,电梯也成为人们日常生活中不可或缺的一部分。随着电梯数量的激增,电梯老龄化,维保数据不透明,物业管理成本高,政府监管…

openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表

文章目录 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表211.1 禁止操作211.2 高危操作 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表 各项操作请严格遵守指导书操作,同时避免执行如下高危操作。 211.1 禁止操作 表1中描述在产品的操…

【golang】22、functional options | 函数式编程、闭包

文章目录 一、配置 Option1.1 options1.2 funcitonal options 一、配置 Option 1.1 options https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html I’ve been trying on and off to find a nice way to deal with setting options in a…

人机认知何时、何处趋同?何时、何处趋异?

对于“算法与人类认知的差异”,人机认知是否应该趋同还是趋异,这是一个复杂的问题,没有简单的答案。 一方面,人机认知的趋同可以使人类能够更好地理解和利用算法的能力,从而提高工作效率和生活质量。趋同意味着人类可以…

数学公式OCR识别php 对接mathpix api 使用公式编译器

数学公式OCR识别php 对接mathpix api 一、注册账号官网网址:https://mathpix.com 二、该产品支持多端使用注意说明(每月10次) 三、api 对接第一步创建create keyphp对接api这里先封装两个请求函数,get 和post ,通过官方…

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动

20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动 2024/1/30 12:58 缘起,为了在ubuntu20.4.6下使用whisper,以前用的是GTX1080M,装了535的驱动。 现在在PDD拼多多上了入手了一张二手的GTX1080,需要将安装最新的545的驱动程序&#…

VxTerm:SSH工具中的中文显示和乱码时的相关信息和一些基本的知识

当我们写的程序含有控制台(Console)输出时,如果输入内容包含中文时,我们一般需要知道下面的信息,才能正确的搞清楚怎么处理中文显示的问题: 1、实际程序或文件中的实际编码: Linux下的应用程序和文本文件,…

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析

本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案,开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞,该漏洞源于文件server/application/api/contr…

云原生Kubernetes: Ubuntu 安装 K8S 1.23版本(单Master架构) 及故障恢复

目录 一、实验 1.环境 2.安装 Ubuntu 3.连接Ubuntu 4.master节点安装docker 5.node节点安装docker 6.master节点安装K8S 7.添加K8S工作节点 8.安装网络插件calico 9.故障 10.故障恢复 11.测试k8s网络和coredns 二、问题 1.Ubuntu如何修改镜像源 2.Ubuntu和Windo…

C++开发基础之生产者和消费者模型:实现多线程数据交换与同步

0.前言 在并发编程中,处理多个线程之间的数据交换和同步是一个常见而重要的挑战。生产者和消费者模型是一种经典的解决方案,它为我们提供了一种简单而灵活的方法来协调多个线程的操作。无论是构建消息队列、日志记录系统还是任务调度系统,生…

Java 数组形参

java 基本数据类型传递参数时是值传递 ;引用类型传递参数时是引用传递 。 我们根据三道问题来探索一下是什么意思。 首先来看一个问题。 问题一 以下方法调用传递给程序是什么 ? double[] rats {1.2, 3.4, 5.6}; routine( rats );A、rats 的副本 …

DataTable.Load(reader)注意事项

对于在C#中操作数据库查询,这样的代码很常见: using var cmd ExecuteCommand(sql); using var reader cmd.ExecuteReader(); DataTable dt new DataTable(); dt.Load(reader); ...一般的查询是没问题的,但是如果涉及主键列的查询&#xf…