从零开始的字符串

lok*_*oki 9 delphi delphi-10.3-rio

system.sysutils.pas里约热内卢,他们添加了以下说明:

var intPart: String;

... IntPart.Chars[length(IntPart)] in ['1','3','5','7','9'] ...
Run Code Online (Sandbox Code Playgroud)

但是据我所知,s.Chars [xx]始终是从零开始的字符串,所以这样做IntPart.Chars[length(IntPart)] in ['1','3','5','7','9']总是会超出界限吗?

绝对不能写

... IntPart.Chars[length(IntPart)-1] in ['1','3','5','7','9'] ...
Run Code Online (Sandbox Code Playgroud)

还是我想念什么?

LU *_* RD 10

但据我所知,s.Chars [xx]始终是从零开始的字符串

TStringHelper的,无论编译器设置如何({$ ZEROBASEDSTRINGS ON / OFF}),例程均以基于零的字符串形式编写。请参阅SysUtils.TStringHelper.Chars

所以在['1','3','5','7','9']中执行IntPart.Chars [length(IntPart)]总是会超出边界吗?

那是正确的。应该是的Length(IntPart)-1

报告为: SysUtils.InternalTextToCurrency访问超出范围的字符串

更新:在Delphi 10.3.3 Rio中修复。


此外,当范围检查打开时,IntPart.Chars[length(IntPart)]应该引发异常。这也是(中的TStringHelpers.Chars)错误。

报告为: 当索引超出范围时,TStringHelper.Chars不会发出范围错误