德尔福的Char和Chr

时间:2010-03-19 10:33:27

标签: delphi char

用于转换类型时Chr和Char之间的区别在于一个是函数而另一个是转换

所以:Char(66) = Chr(66)

我认为没有任何性能差异(至少我从未注意到任何一个,可能会调用另一个)....我相当有人会在此纠正我!

编辑感谢Ulrich的测试证明他们实际上是相同的 编辑2 任何人都可以想到它们可能不相同的情况,例如:由于上下文,你被推向使用另一个?

您在代码中使用了哪些内容?为什么?

6 个答案:

答案 0 :(得分:5)

我在D2007做了一个小测试:

program CharChr;

{$APPTYPE CONSOLE}

uses
  Windows;

function GetSomeByte: Byte;
begin
  Result := Random(26) + 65;
end;

procedure DoTests;
var
  b: Byte;
  c: Char;
begin
  b := GetSomeByte;
  IsCharAlpha(Chr(b));
  b := GetSomeByte;
  IsCharAlpha(Char(b));

  b := GetSomeByte;
  c := Chr(b);
  b := GetSomeByte;
  c := Char(b);
end;

begin
  Randomize;
  DoTests;
end.

两个调用都生成相同的汇编代码:

CharChr.dpr.19: IsCharAlpha(Chr(b));
00403AE0 8A45FF           mov al,[ebp-$01]
00403AE3 50               push eax
00403AE4 E86FFFFFFF       call IsCharAlpha
CharChr.dpr.21: IsCharAlpha(Char(b));
00403AF1 8A45FF           mov al,[ebp-$01]
00403AF4 50               push eax
00403AF5 E85EFFFFFF       call IsCharAlpha

CharChr.dpr.24: c := Chr(b);
00403B02 8A45FF           mov al,[ebp-$01]
00403B05 8845FE           mov [ebp-$02],al
CharChr.dpr.26: c := Char(b);
00403B10 8A45FF           mov al,[ebp-$01]
00403B13 8845FE           mov [ebp-$02],al

编辑:修改了示例,以缓解尼克的担忧。

编辑2:尼克的愿望是我的命令。 ; - )

答案 1 :(得分:3)

帮助说: Chr返回字符类型表达式X的序数值(ASCII值)的字符。 *

那么,一个角色如何在计算机的记忆中表现出来?猜猜一下,作为一个字节*。实际上,Chr和Ord函数仅用于Pascal是一种严格类型的语言,禁止使用字符*来请求字符。对于计算机,生成的char仍然表示为byte * - 然后它将转换为什么?实际上没有为此函数调用发出代码,就像没有为类型转换省略代码一样。 Ergo:没有区别。

您可能更喜欢chr以避免输入类型。

注意:类型转换不应与显式类型转换混淆!在Delphi 2010中写一些类似Char(a)的东西,而a是一个AnsiChar,实际上会做点什么。

**对于Unicode,请将整数替换为*

修改:

只是一个明确的例子(假设非Unicode):

var
  a: Byte;
  c: char;
  b: Byte;
begin
  a := 60;
  c := Chr(60);
  c := Chr(a);
  b := a;
end;

生成类似的代码

ftest.pas.46: a := 60;
0045836D C645FB3C         mov byte ptr [ebp-$05],$3c
ftest.pas.47: c := Chr(60);
00458371 C645FA3C         mov byte ptr [ebp-$06],$3c
ftest.pas.48: c := Chr(a);
00458375 8A45FB           mov al,[ebp-$05]
00458378 8845FA           mov [ebp-$06],al
ftest.pas.49: b := a;
0045837B 8A45FB           mov al,[ebp-$05]
0045837E 8845F9           mov [ebp-$07],al

将字节分配给字节实际上与通过CHR()将字节分配给char相同。

答案 2 :(得分:2)

chr是一个函数,因此它返回一个类型为char的新值。

char(x)是一个强制转换,这意味着使用了实际的x对象,但它是一种不同的类型。

许多系统功能,如inc,dec,chr,ord,都是内联的。

charchr都很快。使用每次最合适的一个,
并且更好地反映了你想做的事情。

答案 3 :(得分:0)

Chr是函数调用,它比类型转换更有点(微小)。但我认为Chr是由编译器内联的。

答案 4 :(得分:0)

它们是相同的,但它们 不相同。不要求字符的内部表示以其序数值映射1对1。没有说保持值Char 'A'变量必须保持数值65.要求是当您在该变量上调用Ord时,结果必须是65,因为这是在程序的字符编码中为字母 A 指定的代码点。

当然,该要求的最简单实现也是为了使变量保持数值65。因此,函数调用和类型转换始终是相同的。

如果实现不同,那么当您调用Chr(65)时,编译器将查找代码点65处的字符并将其用作结果。当你编写Char(65)时,只要存储在内存中的数值结果为65,编译器就不会担心它真正代表什么字符。

这是分裂的头发吗?是的,绝对,因为在所有当前的实现中,它们是相同的。我把它比作空指针是否必然为零的问题。它不是,但在所有实现中,无论如何都会以这种方式结束。

答案 5 :(得分:0)

chr是类型安全的,char不是:尝试编码chr(256)并且您将收到编译器错误。尝试编写char(256)代码,您将获得序数值为0或1的字符,具体取决于您的计算机内部整数表示。

我将通过说这适用于pre-unodeode Delphi来对上述内容进行后缀。我不知道是否更新了chr和char以考虑unicode。