繁体   English   中英

德尔福的Char和Chr

[英]Char and Chr in Delphi

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

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

我不认为有任何性能差异(至少我从来没有注意到任何,可能会调用另一个)....我很确定有人会纠正我这个!

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

你在代码中使用了哪些?为什么?

我在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:尼克的愿望是我的命令。 ;-)

帮助说: 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相同。

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

char(x)是一个强制转换,表示使用实际的x对象但是作为不同的类型。

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM