(delphi11最新学习资料) Object Pascal 学习笔记---第6章第3节(使用[ ]和字符串字符的计数模式)

6.3.2 使用[ ]和字符串字符的计数模式

​ 如果你使用过 Object Pascal 或其他编程语言,你可能会知道,访问字符串中的元素是一种关键的字符串操作,通常使用方括号符号([])来实现,与访问数组元素的方式相同。

​ 在 Object Pascal 中,有两种略有不同的方法来执行这些操作:

  • Chars[] 字符串类型辅助操作(整个列表在下一节)是一种使用基于零的索引的只读字符访问。
  • 标准[]字符串操作符支持读写,默认使用经典的 Pascal 单索引。这一设置可以通过编译器指令进行修改。

​ 在下面简短的历史说明之后,我将对这一问题进行一些澄清。如果你不感兴趣,可以跳过这部分内容,原因是如果不了解一段时间以来发生的事情,就很难理解为什么语言会以现在的方式运行。

注解:让我回顾一下过去,解释一下我们是如何取得今天的成就的。在早期的 Pascal 语言中,字符串被当作字符数组来处理,其中第一个元素(即数组的零元素)用于存储字符串中有效字符的个数或字符串长度。在当时,C 语言每次都要重新计算字符串的长度,寻找 NULL 结束符,而 Pascal 代码则可以直接检查该字节。由于长度使用的是 0 字节,因此字符串中实际存储的第一个字符恰好位于位置 1。

随着时间的推移,几乎所有其他语言的字符串和数组都采用了索引从零开始。后来,Object Pascal 动态数组的索引也是从零开始,大多数 RTL 和组件库都使用了以零为基数的数据结构,只有字符串是一个明显的例外。

在转向移动平台时,Object Pascal 语言设计者决定 "优先 “使用索引从零开始的字符串,允许开发人员在有现有的Object Pascal源代码要迁移的情况下仍然使用旧的模型,并通过编译器指令控制行为。不过,在 Delphi 10.4 中,为在目标平台上保持源代码的一致性,又回到最初的决定。换句话说,决定支持“单源多平台”目标,而不是“像其他现代语言一样”的目标。

​ 要更好地解释索引基数的差异,我们可以通过一个例子进行对比。可以对比一下欧洲和北美是如何计算楼层的(老实说,我不知道世界其他地区是如何计算的)。在欧洲,底层为零层,一楼为其上一层(有时正式表示为 “地上一层”)。在北美,一楼是地面层,二楼是地面层以上的第一层。换句话说,美国使用基于一层的楼层索引,而欧洲使用基于零层的楼层索引。

​ 就字符串而言,绝大多数编程语言都使用从零开始的索引,而不管它们是在哪个大洲发明的。Delphi 和大多数 Pascal 方言使用的是从1开始的索引。

​ 让我来解释一下字符串索引的情况。如上所述,Chars[] 符号总是使用基于零的索引。因此,如果编写:

var
  String1: string;
begin
  String1 := 'Hello world';
  Show(String1.Chars[1]);

输出将是:

e

如果使用直接的[]记法,以下代码的输出是什么:

Show(String1[1]);

​ 默认情况下,输出将是H。但如果编译器定义 $ZEROBASEDSTRING 已打开,则输出可能为 e。目前(即在 Delphi 10.4 版本之后)的建议是在所有代码中使用从 1 开始的字符串,并避免可能源于围绕默认的从零开始的模型设计的中间遗留代码的问题。

​ 但是,如果你想编写的代码无论 $ZEROBASEDSTRING 设置如何都能正常工作呢?在这种情况下,可以使用 Low(string) 作为第一个值的索引,使用 High(string) 作为最后一个值的索引。无论编译器对字符串索引的基数设置如何,它们都能返回正确的值:

var
  S: string;
  I: Integer;
begin
  S := 'Hello world';
  for I := Low(S) to High(S) do
    Show(S[I]);

​ 换句话说,字符串中的元素总是对同一字符串调用Low函数和High函数的结果之间的元素。

注解: 字符串就是字符串,基于零的字符串概念是完全错误的。内存中的数据结构没有任何不同,因此您可以将任何字符串传递给使用任何基值符号的函数,完全没有问题。换句话说,如果你有一个使用零基符号访问字符串的代码片段,你可以将字符串传递给一个设置索引从1开始编译的函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Container killed on request. Exit code is 143

Bug信息 WARN YarnAllocator: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 Killed by externa…

供应链|NUS覃含章MS论文解读:数据驱动下联合定价和库存控制的近似方法 (二)

编者按 本次解读的文章发表于 Management Science,原文信息:Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在数…

助力智能化农田作物除草,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中,关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了,结合智能化的设备可以实现只能除草等操作,玉米作物场景下的杂草检测我们则少有涉及,这里本文的主要目的就是想要基于YOLOv7系列的模型来开发…

Android14之解决编译报错:bazel: no such file or directory(一百八十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

如何通过代理IP安全使用Linkedln领英?

LinkedIn是跨境外贸必备的拓客工具,世界各地的许多专业人士都使用领英来作为发布和共享内容的主要工具,这使得它成为跨境出海必备的渠道工具。 但是不少做外贸的朋友都知道,领英账号很容易遭遇限制封禁,但如果善用工具&#xff0…

中小型水库安全监测运营解决方案,筑牢水库安全防线

我国水库大坝具有“六多”的特点。第一,总量多。我国现有水库9.8万座,是世界上水库大坝最多的国家。第二,小水库多。我国现有水库中95%的水库是小型水库。第三,病险水库多。 目前,在我国水库管理中,部分地方…

第3届图像处理与媒体计算国际会议(ICIPMC 2024)即将召开!

2024年第3届图像处理与媒体计算国际会议(ICIPMC2024)将于2024年5月17-19日在中国合肥举行。本次大会由安徽大学、西北工业大学,西北大学和IEEE联合主办。ICIPMC 2024旨在汇集该领域领先的学术科学家、研究人员和学者,并进行交流和…

Linux学习-C语言-运算符

目录 算术运算符: - * /:不能除0 %:不能对浮点数操作 :自增与运算符 i:先用再加 i:先加再用 --:自减运算符 常量,表达式不可以,--,变量可以 赋值运算符 三目运算符 逗号表达式 size…

Opencv基本操作 (上)

目录 图像基本操作 阈值与平滑处理 图像阈值 图像平滑处理 图像形态学操作 图像梯度计算 Sobel 算子 Canny 边缘检测 图像金字塔与轮廓检测 图像轮廓 接口定义 轮廓绘制 轮廓特征与相似 模板匹配 傅里叶变换 傅里叶变换的作用 滤波 图像基本操作 读取图像&…

关键字:private关键字作用,解析及用法

private关键字在 Java 中用于定义类的成员(如变量、方法)的访问权限。它表示该成员只能在类的内部被访问和修改,而在类的外部是不可见的。 以下是private关键字的主要作用和解析: 作用: 封装性:通过将类的…

低代码中的可视化表单:效率与灵活兼备的设计工具

近年来,随着数字化转型的加速推进,企业对于高效率、灵活性和可定制性的软件开发需求不断增长。传统的软件开发过程通常需要耗费大量的时间和资源,而低代码开发平台的出现为企业提供了一种更加快速和灵活的解决方案。在低代码开发平台中&#…

【QT+QGIS跨平台编译】之五十九:【QGIS_CORE跨平台编译】—【错误处理:字符串错误】

文章目录 一、字符串错误二、处理方法三、涉及到的文件四、宽字节与多字节问题五、字符转换处理一、字符串错误 常量中有换行符错误: 也有const char * 到 LPCWSTR 转换的错误 二、处理方法 需要把对应的文档用记事本打开,另存为 “带有BOM的UTF-8” 三、涉及到的文件 src…

Vue3+springboot实现简单登录demo

Vue3从0搭建脚手架步骤【默认已安装node.js】 前置条件:默认已安装node.js、yarn 第一步:创建项目 选择任意一个空白文件夹如下: cmd进入该文件夹下的命令窗口模式,然后输入指令创建vue项目:vue create my-project …

vue3中实现elementPlus表格选中行的上移下移

先看效果&#xff1a; 实现步骤&#xff1a; 1、给el-table添加current-change事件、高亮属性及ref属性 2、给上移下移按钮添加事件 // 定义当前选中的行参数 const currentRow ref<any>(null); // 定义表格的ref const singleTableRef ref(); // 行选中事件 const ha…

【机器学习:Recommendation System】推荐系统

推荐系统&#xff08;或推荐系统&#xff09;是一类机器学习&#xff0c;它使用数据来帮助预测、缩小范围并在呈指数级增长的选项中找到人们正在寻找的内容。 【机器学习&#xff1a;Recommendation System】推荐系统 什么是推荐系统&#xff1f;用例和应用电子商务与零售&…

阿里云轻量服务器,ubuntu20.04安装Redis

第一步&#xff1a;下载xshell7,连接阿里云服务器 就是下图这个ip 第二步&#xff1a;输入用户名和密码 上面那一步完成之后&#xff0c;就会弹出来下面这个图片 用户名是root 密码是你的阿里云服务器密码 如果你要是忘了&#xff0c;如下图&#xff0c;重置密码&#xff0…

AI Agent

目录 一、什么是Agent 二、什么是MetaGPT【多智能体框架介绍】 三、MetaGPT的背景 一、什么是Agent 智能体 LLM观察思考行动记忆 Agent&#xff08;智能体&#xff09; 一个设置了一些目标或任务&#xff0c;可以迭代运行的大型语言模型。这与大型语言模型&#xff08;LLM&am…

ywtool network命令

一.network功能介绍 network功能就是通过脚本的方式配置IP信息&#xff0c;分为4项: (1) 配置单网卡(2)配置br网桥(单网卡)(3)配置bond(两张网卡)(4)配置ovs网桥(单网卡) 日志文件:/var/log/ywtools/ywtools-network.log/usr/local/ywtools/config/config.ini中network参数:…

电子科技大学课程《计算机网络系统》(持续更新)

前言 本校的课程课时有所缩减&#xff0c;因此可能出现与你学习的课程有所减少的情况&#xff0c;因此对其他学校的同学更多的作为参考作用。本文章适合学生的期中期末考试&#xff0c;以及想要考研电子科技大学的同学&#xff0c;电子科技大学同学请先看附言。 第一章 计算…

Mac OS 制作可引导安装器并重新安装系统

Mac 使用 U盘或移动固态硬盘制作可引导的安装器&#xff08;以 Monterey 为例&#xff09; 本教程参考 Apple 官网相关教程 创建可引导 Mac OS 安装器 重新安装 Mac OS 相关名词解释 磁盘分区会将其划分为多个单独的部分&#xff0c;称为分区。分区也称为容器&#xff0c;不同…