«Ни один ремесленник, который стремится к вершинам своей профессии, не примет негодных инструментов; и ни один производитель, который ценит качество работы, не будет упрашивать ремесленника принять их»
17. Константы
Константы можно подразделить на следующие категории:
v числовые (numerals);
v строковые константы (string constants, character strings or string literals);
v константы, используемые для задания перечисляемого типа;
v предопределенные константы (True, False, and nil);
v объявляемые константы (declared constants).
Константы, которые вводятся с помощью индивидуальных описаний (объявлений) подразделяются, в свою очередь, на истинные и типизированные (true constants or typed constants). Они внешне похожи, однако подчиняются разным правилам и используются для разных целей.
Формат объявления истинных констант:
const identifier = constantExpression;
Если константное выражение имеет порядковый тип, можно использовать приведение типа (typecast), например:
const MyNumber = Int64(17);
Если константное выражение:
v является строкой символов, то оно совместимо со строкой любого типа;
v имеет вещественный тип, то компилятор выбирает для константы тип Extended;
v имеет целочисленный тип, то для него выбирается тип Longint, если только значение константы не выходит за границу диапазона для этого типа. В противном случае для константы выбирается тип Int64.
В константных выражениях можно использовать функции, перечисленные в таблице.
Abs |
Addr |
ArcTan |
Chr |
Cos |
Exp |
Frac |
Hi |
High |
Int |
Length |
Ln |
Lo |
Low |
Odd |
Ord |
Pred |
Round |
Sin |
SizeOf |
Sqr |
Sqrt |
Succ |
Swap |
Trunc |
Типизированные константы
Эти константы, в отличие от истинных, могут иметь тип массив, запись, указатель или процедурный. Вообще они могут иметь любой тип, кроме файлового и варианта. По умолчанию (директива компилятора {$J+}) типизированные константы могут изменять свои значения в процессе выполнения программы, т.е. ведут себя как инициализированные переменные. В случае указания директивы компилятора {$J–} они ведут себя как истинные константы, т.е. переменные, доступные только для чтения (read-only variables).
Директива компилятора {$J+} введена для совместимости с ВР и младшими версиями Delphi. В новых приложениях рекомендуется инициализировать переменные вместо использования типизированных констант.
Примеры:
const Digits: array[0..9] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
const Digits: array[0..9] of Char = '0123456789';
type TCube = array[0..1, 0..1, 0..1] of Integer;
const Maze: TCube = (((0, 1), (2, 3)), ((4, 5), (6,7)));.
type
TPoint = record
X, Y: Single;
end;
TVector = array[0..1] of TPoint;
TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
const
Origin: TPoint = (X: 0.0; Y: 0.0);
Line: TVector = ((X: - 3.1; Y: 1.5), (X: 5.8; Y: 3.0));
Процедурные константы.
Пример:
function Calc(X, Y: Integer): Integer;
begin
. . .
end;
type TFunction = function(X, Y: Integer): Integer;
const MyFunction: TFunction = Calc;.
. . .
I := MyFunction(5, 7)
Константы типа указатель.
При объявлении такая константа должна быть инициализирована так, чтобы адрес, по крайней мере, относительный, мог быть вычислен на этапе компиляции. Для этого есть три способа: с помощью операции взятия адреса @, константы nil и, если константа имеет тип PChar, с помощью строковой константы. Например, если I является глобальной переменной, можно объявить константу так:
const PtrI: ^Integer = @I;
Другие примеры:
const PF: Pointer = @MyFunction;
WarningStr: PChar = 'Warning!';
Локальные и динамические переменные не могут использоваться для инициализации константных указателей.
«16. Переменные»
18. Описания подпрограмм