Delphi中字符串的CompareStr和'='之间的区别

12

我只想知道在Delphi中比较字符串时CompareStr=之间的区别。它们都产生相同的结果。

if(str2[i] = str1[i]) then
  ShowMessage('Palindrome')

if(CompareStr(str2[i], str1[i]) = 0) then
  ShowMessage('Palindrome')

两者均显示“回文”消息。


7
这个问题涉及比较字符串,但根据提供的代码,你正在比较字符。很难确定这里所问的是什么。 - kludg
@Serg +1,好观点。我假设str1str2是字符串数组。但也许不是这样的..... - David Heffernan
4个回答

23

当你想知道一个字符串相对于另一个字符串的位置时,使用CompareStr,而不是仅仅想知道两个字符串是否相等。如果第一个参数在字母表中先出现,则它将返回小于0的值;如果第一个参数在第二个参数之后,则它将返回大于0的值。

如果没有CompareStr,你可能会有这样的代码:

if str1[i] = str2[i] then begin
  // They're equal
end else if str1[i] < str2[i] then begin
  // str1 comes first
end else begin
  // str2 comes first
end;

这段代码比较了str1str2两次。使用CompareStr,您可以删去其中一个字符串比较,并将其替换为更便宜的整数比较:

x := CompareStr(str1[i], str2[i]);
if x = 0 then begin
  // They're equal
end else if x < 0 then begin
  // str1 comes first
end else begin
  // str2 comes first
end;

正如 Gerry 的回答所解释的那样,该函数在排序函数中非常有用,特别是因为它具有与其他比较函数(如 CompareTextAnsiCompareStr)相同的接口。排序函数是一个模板方法,每个函数都充当比较策略

如果你只想测试相等性,请使用=运算符——这更容易阅读。当需要额外的功能时,请使用CompareStr


7
假设 Str1 和 Str2 是字符串,而不是数组(或列表)或字符串,则第一种版本将更有效率,因为第二个版本将首先将 str1[i]str2[i] 复制到两个新字符串中,然后调用一个带有相关开销的函数。
第一种版本将简单地比较 str1[i] 和 str2[i] 引用的单个字符。
如果您只想知道字符串是否相同,请使用=。如果您需要知道字符串是否相同或哪个字符串更大,请使用 CompareStr
当对列表进行排序时, CompareStr 特别有用,例如使用 TList.Sort(CompareFunc)TStringList.Sort(CompareFunc)
如果您想进行大小写不敏感的比较,请使用 CompareText。

2
对于 CompareText,加上 +1。不区分大小写很可能是不使用 = 的最重要原因。 - jpfollenius

1

就这样?只有结果类型不同吗?那么我想它基本上是一样的。 - CyprUS
如果我没记错的话,在早期版本的Delphi中,==用于调用CompareStr函数。 - CodesInChaos
2
@CodeInChaos:Delphi从未支持过像==这样的非Pascal运算符。 - Gerry Coll
@Gerry 显然我是指比较运算符= - CodesInChaos
@Chaos - 抱歉,我以为你的意思是像某些语言中的 === 一样作为附加运算符。 <troll>(可能是设计不良的症状?)</troll> - Gerry Coll

1
除了返回值(整数与布尔值),从代码中可以看出,对于CompareStr,“比较操作基于每个字符的8位序数值,并且不受当前用户区域设置的影响”。因此,看起来CompareStr最初是FastCode例程的一部分,并且本质上是为了性能原因而开发的优化Ansi版本。我总是倾向于使用“=”,“<”,“>”等符号。

1
CompareStr最初并不是FastCode的产物,它最初来自Turbo Pascal。Delphi添加了AnsiCompareStr以解决不同代码页的问题。FastCode改进了CompareStr。 - Rob Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接