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

Jas*_*uit 7 delphi

在Delphi中,为什么AnsiStrings从一个索引,而动态数组从零索引?这是一次历史性的事故,让AnsiStrings更像ShortStrings,还是有更深层次的逻辑?

dth*_*rpe 11

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

我记得UCSD Pascal在Turbo Pascal出现之前很久就使用了这种长度为零字节的约定.

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

很可能是因为字符串类型是每个人第一次遇到的第一个类似数据的数据类型,并且可能是最常用的数据类型,所以可能存在对语言中基于1的索引的偏见.但是,如果仔细观察,我认为你会发现Pascal中的数组(与字符串不同)从来就不是基于1的,特别是在动态分配时.

  • 嗯,有趣的东西.Dissasembler写这样的代码:`mov ebx,[esp + ebx*4- $ 04]`但这只是一个操作码.因此无论操作看起来如何复杂,芯片都会处理它.我从来不知道这一点,并且一直在虚假的印象中劳作.谢谢你让我直截了当. (2认同)