【问题标题】:Difference between CompareStr and '=' for Strings in DelphiDelphi中字符串的CompareStr和'='之间的区别
【发布时间】:2011-06-23 10:11:56
【问题描述】:

我只想知道CompareStr= 在Delphi 中比较字符串的区别。两者产生相同的结果。

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

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

两者都显示消息回文。

【问题讨论】:

  • 问题是关于比较字符串,但从提供的代码来看,您正在比较字符。很难说出这里问了什么。
  • @Serg +1 好点,我假设str1str2 是字符串数组。但也许不是.....

标签: delphi


【解决方案1】:

当您只想查看两个字符串是否相等时,不要使用CompareStr,而是当您想知道一个字符串与另一个字符串的比较时。如果第一个参数首先出现,它将返回一个小于 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;

As Gerry's answer 解释说,该函数在排序函数中特别有用,特别是因为它与其他比较函数(如CompareTextAnsiCompareStr)具有相同的接口。排序函数是一个template method,每个函数作为一个比较strategy

如果您只想测试是否相等,请使用= 运算符——它更易于阅读。当您需要它提供的额外功能时,请使用CompareStr

【讨论】:

    【解决方案2】:

    假设 Str1 和 Str2 是字符串,而不是数组(或列表)或字符串,第一个版本会更高效,因为第二个版本会先将 str1[i]str2[i] 复制到两个新字符串,然后调用函数,以及相关的开销。

    第一个版本将简单地比较 str1[i] 和 str2[i] 引用的单个字符

    如果您只关心字符串是否相同,请使用=。如果您需要知道字符串是否相同,或者哪个字符串更大,请使用CompareStr

    CompareStr 在排序列表时特别有用,例如使用TList.Sort(CompareFunc)TStringList.Sort(CompareFunc)

    如果您想要不区分大小写的比较,请使用 CompareText。

    【讨论】:

    • +1 表示CompareText。不区分大小写可能是不使用= 的最重要原因。
    【解决方案3】:

    当比较的字符串不相等时,结果不一样。 CompareStr 或 AnsiCompareStr 的结果是整数类型,从字面上显示了这些字符串如何比较的更多信息。看看http://www.delphibasics.co.uk/RTL.asp?Name=AnsiCompareStr

    【讨论】:

    • 就这样?只有结果类型不同?然后我猜它几乎是一样的
    • 如果我没记错的话 == 在早期版本的 Delphi 中曾调用 CompareStr
    • @CodeInChaos:Delphi 从来不支持像 == 这样的非 Pascal 运算符。
    • @Gerry 显然我的意思是比较运算符=
    • @Chaos - 抱歉,您以为您的意思是在某些语言中像 === 这样的附加运算符。 (可能是设计不佳的症状?)
    【解决方案4】:

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

    【讨论】:

    • CompareStr 最初并非来自 FastCode。它最初是涡轮帕斯卡。 Delphi 添加了 AnsiCompareStr 来说明不同的代码页。 FastCode 改进了 CompareStr。
    猜你喜欢
    • 2017-01-29
    • 2013-05-26
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多