помощь говорит: Chr возвращает символ с порядковым значением (значение ASCII) выражения байт типа, X. *
Итак, как символ представлен в памяти компьютера? Угадайте, что, как байт *. На самом деле функции Chr и Ord существуют только там, где Pascal является строго типизированным языком, запрещающим использование байтов *, где запрашиваются символы. Для компьютера результирующий символ по-прежнему представляется в виде байта * - для чего он будет тогда преобразован? На самом деле для этого вызова функции не существует кода, так же, как нет кода, опущенного для типа. Эрго: нет разницы.
Вы можете предпочесть chr
, чтобы избежать литого типа.
Примечание: тип приведения не следует путать с явными преобразованиями типов! В Delphi 2010 написано что-то вроде Char(a)
, в то время как AnsiChar, на самом деле что-то сделает.
** Для Unicode замените байт с целыми *
Edit:
Просто пример, чтобы понять (предполагая, что не-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, - это если вы делаете явное приведение, например, от AnsiChar. Спасибо Uwe Raabe –
Это похоже на случай дублирования функций, возможно, по историческим причинам. Что-то вроде «исходной версии было вызвано Chr(), но тогда кто-то сказал, это будет иметь больше смысла, если мы назовем ее Char(), поскольку она в основном является типом для Char, но мы не можем ее изменить, потому что есть много существующий код, который использует Chr(), и это сломает его, поэтому мы просто поместим их обоих ». Это просто догадка, но это, вероятно, довольно близко к тому, что на самом деле произошло. –
Оригинальный Паскаль от Дженсена/Вирта уже имел функцию Chr(), но никаких отливок типа. Они не вписывались в дизайн языка. –