gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:50:57 25 4
gpt4 key购买 nike

在 Delphi 中,为什么 AnsiStrings 从 1 开始索引,而动态数组从 0 开始索引?这是一个历史意外,让 AnsiStrings 更像 ShortStrings,还是有更深层的逻辑在起作用?

最佳答案

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

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

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

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

关于delphi - Delphi 中的字符串索引与动态数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13132973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com