Delphi 中的字符串索引与动态数组索引

问题描述 投票:0回答:3

为什么在 Delphi 编程语言中 AnsiStrings 从 1 开始索引,动态数组从 0 开始索引?

这是一个历史意外,让 AnsiStrings 更像 ShortStrings,还是有更深层的逻辑在起作用?

delphi ansistring
3个回答
12
投票

导致“Pascal”字符串被 1 索引而不是 0 索引的影响因素之一是字符串的长度存储在第 0 个字节中。是的,通过让编译器在内部向字符串索引表达式添加一个常量偏移量(就像后来在 Delphi 的长字符串中所做的那样),这可以从程序员的视野中隐藏起来,但一开始事情要简单得多。分配一块内存,将长度存储在字节 0 中,从字节 1 开始索引 char 数据。故事结束。

我记得 UCSD Pascal 早在 Turbo Pascal 出现之前就使用了这种零字节长度约定。

至于为什么动态数组是从零开始的,我不记得任何具体原因,但我猜它反映了动态数组与动态分配缓冲区和索引缓冲区指针的亲缘关系。用于创建数组指针类型的数组类型是从零开始的数组。第一个字节位于缓冲区指针 + 0 偏移量处。这是从零开始的一切的 C 合理化。当字符串基于 1 的索引已经(并且一直是)例外而不是规范时,没有令人信服的理由将字符串基于 1 的索引模式转移到编译器管理的数组。

很可能因为字符串类型是每个人第一次遇到的第一个类似数组的数据类型,并且可能是全面使用最多的数据类型,所以可能会认为该语言偏向于基于 1 的索引。然而,如果你仔细观察,我想你会发现 Pascal 中的数组(与字符串不同)本质上从来不是基于 1 的,尤其是在动态分配时。


4
投票

Delphi 字符串传统基于 1 的字符串的原因非常简单。这一传统来自旧式 Turbo Pascal 字符串的实现。该数据类型将字符串的长度存储在变量的第一个字节(索引 0)中。字符串数据从下一个字节(索引 1)开始。

您今天仍然可以使用该数据类型。现在它被称为 ShortString。从其实现中可以明显看出,有 255 个字符的限制。如果我没记错的话,这个限制导致了 Delphi 2 中引入了大字符串。当引入大字符串时,语言设计者选择保留基于 1 的索引,以便开发人员更容易从短字符串切换到大字符串。

我猜 Turbo Pascal 并没有发明使用元素 0 作为长度的想法。只是我太小了,不记得之前发生的事情了!

动态数组不再像以前一样受到过去的束缚,可以自由选择。我不知道为什么选择零基础。也许是因为它更适合当时Delphi所在平台的流行时尚,即Windows。但这只是一个猜测。 Danny Thorpe 当时正在研究 Delphi 编译器,连他都不记得原理了

Delphi 语言设计者目前正在转向对大字符串进行从零开始的字符串索引。这个方向的初始步骤可以在 XE3 中的 TStringHelper 类中看到,它使用基于 0 的索引。并且在 ZEROBASEDSTRINGS 条件中允许您选择基于 0 的索引。期望下一代 Delphi 编译器仅使用基于 0 的索引。时代正在改变。


0
投票

历史事故。

Pascal 字符串和数组传统上从 1 开始。

C - 也许因此 AnsiStrings - 从 0 开始。

我不知道动态数组“打破帕斯卡传统”的理由,它也是从零开始的。不过有道理,我也同意……

恕我直言...

© www.soinside.com 2019 - 2024. All rights reserved.