在Delphi中,为什么AnsiStrings从一个索引,而动态数组从零索引?这是一次历史性的事故,让AnsiStrings更像ShortStrings,还是有更深层的逻辑?
解决方法
导致“Pascal”字符串被索引而不是0索引的一个因素是字符串的长度存储在第0个字节中.是的,通过让编译器在内部向字符串索引表达式添加一个常量偏移量(就像之后在Delphi的长字符串中所做的那样),可能已经从程序员的视图中隐藏了这一点,但在开始时事情要简单得多.分配一块内存,以字节零存储长度,从字节1索引char数据.故事结束.
我记得UCSD Pascal在Turbo Pascal出现之前就已经使用了这个长度为零字节的约定.
至于为什么动态数组是基于零的,我不记得任何特定的原因,但我猜它反映了动态数组的动态分配缓冲区和索引缓冲区指针的亲缘关系.用于创建数组指针类型的数组类型是基于零的数组.第一个字节位于缓冲区指针0偏移处.这是基于零的一切的C合理化.当基于字符串1的索引已经(并且一直是)异常而不是常态时,没有令人信服的理由将基于字符串1的索引模式传递给编译器托管数组.
很可能是因为字符串类型是每个人第一次遇到的第一个类似数据的数据类型,并且可能是全面使用最常用的数据类型,所以可能存在对语言中基于1的索引的偏差的感觉.但是,如果你仔细观察我认为你会发现Pascal中的数组(与字符串不同)从来就不是基于1的,特别是在动态分配时.