Реферат: Семь чудес и два фокуса на Дельфи
Давайте еще раз, повнимательнее рассмотрим выражение abs(low(integer)). Что можно еще сказать про него? Не смотря на наличее в нем функций, это - константа
Читаем Help потеме "Constant expressions":
...Constant expressions cannot include variables, pointers, or function calls, except calls to the following predefined functions: Abs...Low...
попробуем описать константу со значением равным этому выражению:
...
const
ci = abs(low(integer));
...
Figure 3.
Код компилируется. Значит мы - правы, а это значит, что результат выражения определяется еще на стадии компиляции. Далее, low(integer)) имеет целый тип. Abs от integer - тоже целое, а нам нужно int64. Поробуем переписать код следующим образом:
procedureTfrmAllMiracles.btnAbsMrclClick (Sender: TObject);
const
ci = abs(low(integer));
var
i1: int64;
begin
// i1:= abs((low(integer)));
i1:= abs(int64(low(integer)));
ShowMessage(IntToStr(i1));
end;
Figure 4.
Теперь - заработало. Секрет "Абсолютного чуда" раскрыт! Кстати, abs(int64(low(integer))) - тоже константа.
Следующее чудо - пример того, как вполне правильный код отказывается компилироваться.
Чудотретье (One more low integer miracle).
Новая кнопка на форме будет реагировать на нажатие следующим образом:
procedure TfrmAllMiracles.btnLowIntMrclClick( Sender: TObject);
var
lowInt: integer;
begin