[英]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,都是内联的。
char
和chr
都很快。 使用每次最合适的那个,
并且更好地反映了你想要做的事情。
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.