用于转换类型时Chr和Char之间的区别在于一个是函数而另一个是转换
所以:Char(66) = Chr(66)
我认为没有任何性能差异(至少我从未注意到任何一个,可能会调用另一个)....我相当有人会在此纠正我!
编辑感谢Ulrich的测试证明他们实际上是相同的 编辑2 任何人都可以想到它们可能不相同的情况,例如:由于上下文,你被推向使用另一个?
您在代码中使用了哪些内容?为什么?
答案 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,都是内联的。
char
和chr
都很快。使用每次最合适的一个,
并且更好地反映了你想做的事情。
答案 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。