根据我的知识,Delphi 中的字符串是 1,长度为 0 位置。我负责一个用D5和D2006写的巨大的应用程序,它是使用从0索引复制的复制功能,这个时候有几个同事也在用这种方式编码。因为这是Delphi的'魔法'功能,我相信即使使用Copy从0索引复制字符串,在幕后它也是从位置1复制它。

对我来说,一个好的做法是从第一个位置复制一个字符串,而不是从 0 位置复制,即使结果是相同的。

现在,我的问题是,通过使用从 0 位置的复制功能而不是用于从 1 位置复制传递到其他 Delphi 版本时,应用程序是否会受到影响?

最佳答案

当将 0 作为 Index 参数传递给字符串的 Copy 时,Delphi RTL 会忽略您。当您为 Index 传递 0 或更少时,RTL 使用 1 的值。所以你所做的是良性的,因为在传递 1 或任何小于 1 的值之间没有明显的行为差异。但是,在 Delphi 中使用 0 作为字符串索引肯定会令人困惑,我建议不要这样做。

在伪代码中,Copy 的实现是这样开始的:

function Copy(s: string; Index, Count: Integer): string;
begin
  if Index<1 then
    Index := 1;
  dec(Index);//convert from 1-based to 0-based indexing
  ....continues

实际上实际的实现稍微复杂一些,但是上面的伪代码给出了正确的语义。

您对存储在索引 0 处的长度的评论对于旧式短字符串是正确的。但对于长字符串则不然。事实上,正是这个事实导致了相当奇怪的情况,即字符串是基于 1 的,而动态数组、列表等是基于 0 的。

10-08 04:48