簡體   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