gpt4 book ai didi

delphi - 在Delphi Alexandria RTL中,ScanChar()写得不好吗?

转载 作者:行者123 更新时间:2023-12-02 18:04:08 28 4
gpt4 key购买 nike

在Delphi Alexandria RTL中,他们有这个功能:

function ScanChar(const S: string; var Pos: Integer; Ch: Char): Boolean;
var
C: Char;
begin
if (Ch = ' ') and ScanBlanks(S, Pos) then
Exit(True);
Result := False;
if Pos <= High(S) then
begin
C := S[Pos];
if C = Ch then
Result := True
else if (Ch >= 'a') and (Ch <= 'z') and (C >= 'a') and (C <= 'z') then
Result := Char(Word(C) xor $0020) = Char(Word(Ch) xor $0020)
else if Ch.IsLetter and C.IsLetter then
Result := ToUpper(C) = ToUpper(Ch);
if Result then
Inc(Pos);
end;
end;

我无法理解这种比较的目的:

else if (Ch >= 'a') and (Ch <= 'z') and (C >= 'a') and (C <= 'z') then
Result := Char(Word(C) xor $0020) = Char(Word(Ch) xor $0020)

看起来和这样做是一样的:

else if (Ch >= 'a') and (Ch <= 'z') and (C >= 'a') and (C <= 'z') then
Result := c = Ch

这是真的吗?

最佳答案

else if (Ch >= 'a') and (Ch <= 'z') and (C >= 'a') and (C <= 'z') thenResult := Char(Word(C) xor $0020) = Char(Word(Ch) xor $0020)

此比较的目的是优化并在字符是纯 ASCII 字母时进行更快的比较,并避免通过可以处理 Unicode 字符的 ToUpper 函数调用 WinAPI 的昂贵费用。

或者至少如果比较本身没有被严重破坏的话就会发生这种情况。

比较检查两个字符是否都是小写,并且位于小写字母 a(ASCII 值 97)和小写字母 z(ASCII 值 122)之间的范围。但它实际上应该检查的是两个字符都落入大字母 A(ASCII 值 65)和小字母 z 之间的范围,覆盖整个 ASCII 字母范围,无论他们的情况。 (该范围内几乎没有非字母字符,但这些字符并不相关,因为对于任何这些字符,Result 赋值永远不会产生 True。)

修复此问题后,我们还需要修复 Result 赋值表达式,因为它无法正确比较小写和大写字母。为此,我们可以简单地对所有字符使用 or 运算符,将大写字符转换为小写,并保持小写不变。如前所述,此时在代码中,可以安全地忽略该范围内的非字母字符。

ScanChar 函数该部分的正确代码为:

...
else
if (Ch >= 'A') and (Ch <= 'z') and (C >= 'A') and (C <= 'z') then
Result := Word(Ch) or $0020 = Word(C) or $0020
else
...

注意:即使原始 ScanChar 函数包含不正确的代码,该函数的结果仍然是正确的,因为对于不同大小写的相同字母,代码将始终通过 ToUpper if 分支的一部分。

关于delphi - 在Delphi Alexandria RTL中,ScanChar()写得不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73698212/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com