Delphi RTL игнорирует вас при передаче 0 в качестве параметра Index
для Copy
для строки.Когда вы передаете 0 или меньше для Index
, RTL использует значение 1
.Таким образом, то, что вы делаете, является доброкачественным в том смысле, что нет никаких заметных различий в поведении между передачей 1 или любого значения меньше 1. Однако, безусловно, сбивает с толку использование 0
в качестве строкового индекса в Delphi, и я бы рекомендовал не делать этого.
В псевдокоде реализация 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.