在system.sysutils.pas
中,在里约热内卢,他们添加了以下说明:
var intPart: String;
... IntPart.Chars[length(IntPart)] in ['1','3','5','7','9'] ...
但是据我所知, s.Chars [xx] 将始终为从零开始的字符串,因此,IntPart.Chars[length(IntPart)] in ['1','3','5','7','9']
的执行将始终为越界?
绝对不能写
... IntPart.Chars[length(IntPart)-1] in ['1','3','5','7','9'] ...
或者我想念什么?
答案 0 :(得分: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 accesses a string out of bounds
此外,启用范围检查后,IntPart.Chars[length(IntPart)]
应该引发了异常。这也是错误(在TStringHelpers.Chars
中)。
报告为: TStringHelper.Chars does not issue a range error when index is out of bounds