[英]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.