- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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/
为什么我的组件图标在 Delphi 11 Alexandria 中显示为洋红色背景? 在 Delphi 以前的版本中,它们被理解为透明的。 最佳答案 谢谢大家的建议! 实际上,我通过使用 BRCC32
在Delphi Alexandria RTL中,他们有这个功能: function ScanChar(const S: string; var Pos: Integer; Ch: Char): Boo
在Delphi Alexandria RTL中,他们有这个功能: function ScanChar(const S: string; var Pos: Integer; Ch: Char): Boo
我刚刚从 Delphi 10.4.2 升级到 Delphi 11 Alexandria。我经常使用 RDP,所以当 TPaintBox 失效时我注意到闪烁。奇怪的是,如果带有 TPaintBox 的表
Alexandria 非常擅长将简单的 alist 转换为 plist,例如: > (get-document "flower-photo-with-lytro") ((:|_id| . "flowe
我在 Windows 10 上安装 wsl 并安装 Ubuntu 20.04 LTS 并打开 linux 终端并运行以下命令: sudo apt 更新 sudo apt升级 sudo apt dist
我是一名优秀的程序员,十分优秀!