


                          ГЛАВА 6

                         Выражения

     Выражения состоят из операций и операндов.  Большинство
операций  в языке Паскаль являются бинарными, то есть содер-
жат два операнда. Остальные операции являются унарными и со-
держат только один операнд. В бинарных операциях использует-
ся обычное алгебраическое представление,  например:  a+b.  В
унарных  операциях  операция  всегда  предшествует операнду,
например: -b.
     В более сложных выражениях порядок, в котором  выполня-
ются операции, соответствует приоритету операций (см. Табли-
цу 6.1).

            Порядок выполнения операций          Таблица 6.1
------------------------------------------------------------
  Операция                 Приоритет          Вид операции
------------------------------------------------------------
@, not                первый (высший)       унарная операция
*, /, div, mod,           второй          операция умножения
and, shl, shr
+, -, or, xor             третий           операция сложения
=, <>, <, >,         четвертый (низший)   операция отношения
<=, >=, in
------------------------------------------------------------

     Для определении старшинства операций имеется три основ-
ных правила:

     1.  Во-первых, операнд, находящийся между двумя  опера-
         циями с различными приоритетами, связывается с опе-
         рацией, имеющей более высокий приоритет.
     2.  Во-вторых, операция, находящаяся между двумя опера-
         циями  с  равными  приоритетами,  связывается с той
         операцией, которая находится слева от него.
     3.  В-третьих, выражение, заключенное в  скобки,  перед
         выполнением вычисляется, как отдельный операнд.

                                - 2 -



     Операции с равным приоритетом обычно выполняются  слева
направо,  хотя  иногда компилятор при генерации оптимального
кода может переупорядочить операнды.

                    Синтаксис выражений

     Правила, определяющие порядок выполнения операций,  вы-
текают из синтаксиса выражений, которые строятся из множите-
лей, термов и простых выражений.
     Множитель имеет следующий синтаксис:

                            ------------------------
множитель-------------------! ссылка на переменную !------->
          !       !       ^ ------------------------    ^ ^
          !       !  ---  ! --------------------------- ! !
          !       ->( @ )-->! идентификатор процедуры !-! !
          !          ---  ! --------------------------- ! !
          !               ! -------------------------   ! !
          !               ->! идентификатор функции !---- !
          !                 -------------------------     !
          !  -----------------------                      !
          !->! константа без знака !--------------------->!
          !  -----------------------                      !
          !   ---      -----------------     ---          !
          !->( ( )---->!   выражение   !--->( ) )-------->!
          !   ---      -----------------     ---          !
          !   -----     -------------                     !
          !->( not )--->! множитель !-------------------->!
          !   -----     -------------                     !
          !  -----------------                            !
          !->! вызов функции !--------------------------->!
          !  -----------------                            !
          !  -----------------------                      !
          !->! описатель множества !--------------------->!
          !  -----------------------                      !
          !  ----------------------------                 !
          !->! приведение типа значения !------------------
             ----------------------------

                                - 3 -



     Вызов функции активизирует функцию и представляет собой
значения, возвращаемые функцией (см. далее в этой главе раз-
дел "Вызовы функций"). Описатель множества представляет  со-
бой значение множественного типа (см. раздел, озаглавленный,
как "Описание множеств"). Приведение типа изменяет тип  зна-
чения  (см.  "Приведение  типа").  Константа без знака имеет
следующий синтаксис:

                           -------------------
 Константа без знака ----->! число без знака !------------>
                       !   -------------------          ^
                       !   ---------------------        !
                       !-->! символьная строка !--------!
                       !   ---------------------        !
                       !   ---------------------------  !
                       !-->! идентификатор константы !--!
                       !   ---------------------------  !
                       !    ------                      !
                       !-->( nil  )---------------------!
                            ------

     Некоторые примеры множителей могут включать в себя:

 Х                                    (ссылка на переменную)
 @Х                                (указатель на переменную)
 15                                    (константа без знака)
 (Х+Y+Z)                                      (подвыражение)
 SIN(Х/2)                                    (вызов функции)
 ['0..''9','А'..'Z']                   (описатель множества)
 not Done                   (отрицание булевской переменной)
 сhar(Digit+48)                            (назначение типа)

     Термы используются в операциях умножения на множитель:

                                - 4 -



                        -------------
 терм ----------------->! множитель !-------------->
             ^          -------------       !
             !               ---            !
             !--------------( * )<----------!
             !               ---            !
             !               ---            !
             !--------------( / )<----------!
             !               ---            !
             !              -----           !
             !-------------( div )<---------!
             !              -----           !
             !              -----           !
             !-------------( mod )<---------!
             !              -----           !
             !              -----           !
             !-------------( and )<---------!
             !              -----           !
             !              -----           !
             !-------------( shl )<---------!
             !              -----           !
             !              -----           !
             --------------( shr )<----------
                            -----

     Приведем несколько примеров термов:

 Х*Y
 Z/(1-Z)
 Done or Error
 (Х <= Y) and (Y < Z)

     В простых выражениях к термам применяются операции сло-
жения и присваивания знака:


                                - 5 -


                                           --------
 простое выражение------------------------>! терм !------->
                                       ^   --------   !
                                       !              !
                                       !     ----     !
                                       !----(  + )<---!
                                       !     ----     !
                                       !     ----     !
                                       !----(  . )<---!
                                       !     ----     !
                                       !     ----     !
                                       !----( оr )<---!
                                       !     ----     !
                                       !     -----    !
                                       -----( хоr )<---
                                             -----

     Приведем несколько примеров простых выражений:

 Х+Y
 -Х
Hue1 + Hue2
I*J + 1

     В выражениях к простым выражениям применяются  операции
отношения.
      Приведем некоторые примеры выражений:

 Х = 1.5
 Done <> Error
 (I < J) = (J < К)
 C in Huel

                                - 6 -


          ---------------------
выражение-! простое выражение !---------------------------->
          --------------------- !                        ^
                                !   ---    ------------- !
                                !->( < )-->! простое   !--
                                !   ---  ^ ! выражение !
                                !   ---  ! -------------
                                !->(<= )-!
                                !   ---  !
                                !   ---  !
                                !->( > )-!
                                !   ---  !
                                !   ---  !
                                !->( = )-!
                                !   ---  !
                                !   ---  !
                                !->(>= )-!
                                !   ---  !
                                !   ---  !
                                !->(<> )-!
                                !   ---  !
                                !   ---  !
                                -->(in )--
                                    ---


                          Операции

     Операции подразделяются на арфметические операции,  ло-
гические операции, строковые операции, операции над множест-
вами, операции отношения и  операцию  @ (операция  получения
адреса).

                  Арифметические операции

     В следующей таблице приведены типы операндов и  резуль-
таты для бинарных и унарных арифметических операций:


                                - 7 -


             Бинарные арифметические операции   Таблица 6.2
-----------------------------------------------------------
 Операция  Действие       Типы операндов     Тип результата
-----------------------------------------------------------
    +      Сложение          Целый               Целый
                          Вещественный        Вещественный
    -      Вычитание         Целый               Целый
                          Вещественный        Вещественный
    *      Умножение         Целый               Целый
                          Вещественный        Вещественный
  div      Деление           Целый            Вещественный
                          Вещественный        Вещественный
  mod    Целочисленное
           деление           Целый               Целый
           Остаток           Целый               Целый
----------------------------------------------------------

      Примечание: Операция + используется также, как  опера-
      ция  для работы со строками и множествами. Операции +,
      - и * используются также для операций над множествами.

        Унарные арифметические операции        Таблица 6.3
----------------------------------------------------------
 Операция    Действие     Тип операнда      Тип результата
----------------------------------------------------------
    +    Сохранение знака     Целый            Целый
                           Вещественный      Вещественный
    -    Отрицание знака      Целый            Целый
                           Вещественный      Вещественный
----------------------------------------------------------

     Любая операция, включающая операнд, тип которого  явля-
ется подмножеством перечислимого типа, обрабатывается также,
как если бы он был перечислимого типа.
     Если оба операнда в операциях +, -, *, div или моd  яв-
ляются операндами целого типа, то тип результата будет таким
же, как общий тип обоих операндов. (Определение общего  типа
см. в разделе "Целый тип" в Главе 3).
     Если один или более операндов в операциях +, -,  или  *

                                - 8 -


имеют  вещественный  тип, то тип результата будет веществен-
ным, если использована директива компилятора $N-, или  типом
с  повышенной точностью при использовании директивы компиля-
тора $N+.
     Если при использовании операции  сохранения  знака  или
операции отрицания знака операнд имеет целый тип, то резуль-
тат будет тоже целого типа. Если операнд вещественного типа,
то  тип результата будет вещественным или типом с повышенной
точностью.
     Значение выражения х/у всегда будет вещественного  типа
или  с  повышенной точностью, независимо от типов операндов.
Если у равно 0, то результат будет ошибочным.
     Значение выражение i div j представляет собой математи-
ческое частное от i/j, округленное в меньшую сторону до зна-
чения целого типа. Если j равно 0, результат  будет  ошибоч-
ным.
     Операция mod возвращает остаток, полученный путем деле-
ния двух ее операндов, то есть:

  i mod j = i - (i div j) * j

     Знак результата операции mod будет тем же, что  и  знак
i. Если j равно нулю, то результатом будет ошибка.

                    Логические операции

     Типы логических операций показаны в Таблице 6.4.
     Если операндом операции  not  является  операнд  целого
типа, то результат будет также целого типа.
     Если оба операнда в операциях or, and  или  xor  целого
типа,  то  тип результата будет таким же, как тип обоих опе-
рандов.

             Логические операции               Таблица 6.4
----------------------------------------------------------
 Операция   Действие        Типа операндов  Тип результата
----------------------------------------------------------
 not    Отрицание (битовое)    Целый            Целый
 and       И (битовое)         Целый            Целый
----------------------------------------------------------

                                - 9 -



----------------------------------------------------------
 or        ИЛИ (битовое)       Целый            Целый
 xor    Исключающее ИЛИ        Целый            Целый
           (битовое)
 shl      Сдвиг влево          Целый            Целый
 shr      Сдвиг вправо         Целый            Целый
----------------------------------------------------------

      Примечание: Операция not является унарной операцией.

     Операции i shl j и i shr j сдвигают  значение  i  влево
или  вправо  на  j битов. Тип результата будет таким же, как
тип i.

                     Булевские операции

     Типы операндов и результат для булевских операций пока-
заны в Таблице 6.5.

                      Булевские операции        Таблица 6.5
-----------------------------------------------------------
 Операция    Действие      Типы операндов    Тип результата
-----------------------------------------------------------
 not        Отрицание        Булевский           Булевский
 and      Логическое И       Булевский           Булевский
 or      Логическое ИЛИ      Булевский           Булевский
 xor      Логическое
        исключающее ИЛИ      Булевский           Булевский
-----------------------------------------------------------

      Примечание: Операция not является унарной операцией.

     Результаты этих операций соответствуют обычной  булевой
логике.  Например, выражение a and b является истинным (при-
нимает значение Тruе) только в том случае, если оба операнда
a и b имеют истинное значение (Тruе).
     В Турбо-Паскале поддерживаются две различные модели ге-
нерации кода для операций or и and - полное вычисление и вы-

                                - 10 -


числение по короткой схеме (частичное вычисление).
     При полном вычислении подразумевается, что каждый  опе-
ранд булевского выражения, построенный с помощью операций or
и and, всегда будет вычисляться, даже если  результат  всего
выражения  уже  известен.  Эта  модель полезна в том случае,
когда один или более операндов в выражении представляют  со-
бой  функции  с  побочными эффектами, которые изменяют смысл
программы.
     Вычисление по короткой схеме обеспечивает  строгое  вы-
числение  слева  направо.  Это  вычисление прекращается, как
только результат всего  выражения  становится  очевиден.  Во
многих случаях эта модель удобна, поскольку она обеспечивает
минимальное время выполнения  и,  как  правило,  минимальный
объем  кода.  Вычисление по короткой схеме делает также воз-
можными такие конструкции, которые в противном  случае  были
ба недопустимы, например:

  while (I<=Lenght(S)) and (S[I]<>' ') do Inc(I);
  while (P<>nil) and (P^.Value<>5) do P:=P^.Next;

     В обоих случаях, если  результатом  первого  вычисления
будет значение false, вычисление второго выражения не выпол-
няется.
     Схему  вычисления  можно задавать  с помощью  директивы
компилятора  $В.  Значением  по умолчанию является состояние
{$В-} (пока оно не будет изменено с помощью  "меню"  возмож-
ностей компилятора). В этом случае генерируется код с вычис-
лением по короткой схеме. В случае директивы {$В+} генериру-
ется код с полным вычислением.
     Поскольку в стандартном Паскале не определяется,  какую
схему  следует использовать для вычисления булевских выраже-
ний, то программы, зависящие от действия какой-либо конкрет-
ной схемы, в действительности не являются переносимыми.  Од-
нако, если пожертвовать переносимостью, то очень часто можно
получить  значительный выигрыш во времени выполнения и прос-
тоте, которую позволяет получить вычисление по короткой схе-
ме.


                                - 11 -


                    Операция со строками

     Типы операндов и результаты для  операции  со  строками
показаны в Таблице 6.6.

            Операции со строками              Таблица 6.6
---------------------------------------------------------
 Операция    Действие     Типы операндов   Тип результата
---------------------------------------------------------
    +      Конкатенация    Строковый,        Строковый
                         символьный или
                      упакованный строковый
---------------------------------------------------------

     Турбо-Паскаль позволяет  использовать  операцию  +  для
объединения двух строковых операндов. Результатом операции s
+ t, где s и t имеют строковый тип, символьный тип или  упа-
кованный  строковый тип, будет конкатенация s и t. Результат
будет совместим с любым строковым типом (но не с  символьным
и не с упакованным строковым типом). Если длина результирую-
щей строки превышает 255 символов, то она усекается  до  255
символов.

                  Операции над множествами

     Типы операндов для операций над множествами показаны  в
Таблице 6.7.

             Операции над множествами           Таблица 6.7
-----------------------------------------------------------
 Операция       Действие                 Типы операндов
-----------------------------------------------------------
    +          Объединение  Множества с совместимыми типами
    -           Разность    Множества с совместимыми типами
    *          Пересечение  Множества с совместимыми типами
-----------------------------------------------------------

     Результаты операций соотвествуют правилам логики работы
с множествами:


                                - 12 -


     1.  Перечислимое значение c  содержится  в  a+b  только
         тогда, когда оно содержится в a или в b.
     2.  Перечислимое  значение c  содержится  в  a-b только
         тогда, когда оно содержится в a и не  содержится  в
         b.
     3.  Перечислимое значение c  содержится  в  a*b  только
         тогда,  когда  он содержится в обоих множествах a и
         b.

     Если наименьшим перечислимым значением, которое являет-
ся членом результата операций над множествами, является a, а
наибольшиим - b, то типом результата будет множество a..b.

                     Операции отношения

     Типы операндов и результаты операций отношения приведе-
ны в Таблице 6.8.

                   Операции отношения           Таблица 6.8
-----------------------------------------------------------
 Операция  Действие       Типы операндов     Тип результата
-----------------------------------------------------------
    =       Равно     Совместимый простой,        Булевский
                     указатель, множествен-
                     ный строковый или упа-
                     кованный строковый

   <>    Не равно     Совместимый простой,        Булевский
                     указатель, множествен-
                     ный, строковый или упа-
                     кованный строковый

   <    Меньше чем    Совместимый простой,        Булевский
-----------------------------------------------------------

                                - 13 -


-----------------------------------------------------------
                     указатель, множествен-
                     ный, строковый или упа-
                     кованный строковый

   >    Больше чем    Совместимый простой,        Булевский
                     указатель, множествен-
                     ный строковый или упа-
                     кованный строковый

  <=      Меньше      Совместимый простой,        Булевский
        или равно    указатель, множествен-
                     ный строковый или упа-
                     кованный строковый

  >=      Больше      Совместимый простой,        Булевский
        или равно    указатель, множествен-
                     ный строковый или упа-
                     кованный строковый

  <=  Подмножество   Множества совместимых        Булевский
                          типов

  >=  Надмножество   Множества совместимых        Булевский
                          типов

  in    Элемент      Левый операнд: любой         Булевский
       множества     перечислимый тип t;
                     правый: множество,
                     совместимое с t.
------------------------------------------------------------

                   Сравнение простых типов

     Когда операции =, <>, <, >, >= или <=  применяются  для
операндов  простых типов, то это должны быть совместимые ти-
пы. Однако, если один операнд имеет действительный  тип,  то
другой может быть целого типа.

                                - 14 -


                      Сравнение строк

     Операции отношения =, <>, <, >, >= или <= могут  приме-
нятся  для сравнения строк согласно порядку расширенного на-
бора символов кода АSСII. Любые два значения строковых  дан-
ных  можно сравнить, поскольку все значения строковых данных
совместимы.
     Значения  символьного  типа  совместимы  со  значениями
строкового  типа, и при их сравнении символьное значение об-
рабатывается как строковое значение с  длиной  1.  Когда  со
значением строкового типа сравнивается упакованное строковое
значение из n элементов, то оно обрабатывается, как значение
строкового типа длиной n.

                Сравнение упакованных строк

     Операции отношения =, <>, <, >, >= или <= могут  приме-
нятся  также  для двух упакованных значений строкового типа,
если они содержат одинаковое  число  элементов.  Если  число
элементов  равно  n, то операция соотвествует сравнению двух
строк, каждая из которых имеет длину n.

                    Сравнение указателей

     Операции = и <> могут использоваться для сравнения опе-
рандов типа указатель. Два указателя равны только в том слу-
чае, если они ссылаются на один и тот же объект.

      Примечание: При сравнении указателей  в  Турбо-Паскале
      просто  сравниваются сегменты и смещения. В соответст-
      вии со схемой размещения сегментов  процессоров  80х86
      два  логически  различных  указателя  могут фактически
      указывать на одну и ту же  физическую  ячейку  памяти.
      Например $0040:$0049 и $0000:$0449 являются указателя-
      ми  с  одинаковыми  физическими  адресами.  Указатели,
      возвращаемые  стандартными  процедурами  New и  GetMem
      всегда нормализованы (смещение находится  в  диапазоне
      от  $0000  до  $000F)  и,  таким образом, всегда будут
      сравниваться корректно. При создании указателей с  по-

                                - 15 -


      мощью стандартной функции Рtr, и последующем сравнении
      таких указателей нужно принимать во внимание указанный
      особый случай.

                     Сравнение множеств

     Если операндами являются множества a и  b,  то  при  их
сравнении получаются следующие результаты:

     1.  Выражение a=b истинно только когда a и  b  содержат
         одни и те же элементы, в противном случае a<>b.
     2.  Выражение a = b истинно, когда каждый элемент  мно-
         жества а является также элементом множества b.
     3.  Выражение a = b истинно, когда каждый элемент  мно-
         жества в является также элементом множества a.

           Проверка на принадлежность к множеству

     Операция in возвращает истинное значение (Тrue),  когда
значение элемента перечислимого типа является элементом опе-
ранда множественного типа, в противном случае он  возвращает
значение False.

                         Операция @

     С помощью операции @ можно создать указатель  на  пере-
менную. В Таблице 6.9 показан операнд и типы результата.

                 Операция создания указателя      Таблица
 6.9
------------------------------------------------------------
 Операция   Действие          Типы операндов   Тип
 результата
------------------------------------------------------------
    @      Получение       Ссылка на переменную,   Указатель
           указателя       процедуру или иденти-  (совмести-
                           фикатор функции        мый с nil)
------------------------------------------------------------


                                - 16 -


     Операция @ является унарной операцией, в качестве  опе-
ранда  которой  используется ссылка на переменную, процедура
или идентификатор функции и операнду возвращается указатель.
Тип этого значения является таким же, как тип указателя nil,
и, таким образом, его можно присвоить любому указателю пере-
менной.

          Использование операции @ для переменной

     Использование операции @ для обычной переменной (не па-
раметра) не вызывает никаких сложностей. Введем описания:

 type
   TwoChar = array[0..1] of char;
 var
   Int: integer;
   TwoCharPtr: ^TwoChar;

тогда оператор

  TwoCharPtr := @Int;

приводит к тому,  что TwoCharPtr  для  получения  ссылки  на
TwoCharPtr^ становится повторной интерпретацией значения Int,
как если бы оно было символьным массивом array[0..1].

      Использование операции @ для параметра-значения

     Использование операции @ для формального параметра-зна-
чения  приводит к тому, что будет построен указатель, указы-
вающий на ячейку стека,  в  которой  содержится  фактическое
значение параметра. Предположим, что Fоо является формальным
параметром-значением процедуры, а FооРtr^ является  указате-
лем-переменной. Если в процедуре выполняется операция:

  FooPtr := @Foo;

то FооРtr^ будет ссылкой на значение Fоо. Однако, FооРtr^ не
указывает  на  сам  параметр Fоо, поскольку он  указывает на

                                - 17 -


значение Fоо, которое было взято из Fоо и сохранено в стеке.

     Использование операции @ для параметра-переменной

     Применение операции @ к  параметру-переменной  приведет
к тому, что будет сформирован указатель на фактический пара-
метр (указатель берется из стека). Предположим,  что  Оnе  -
параметр-переменная  процедуры, Тwо - переменная, передавае-
мая в процедуру в качестве фактического параметра-переменной
Оnе, а ОnеРtr является указателем на переменную. Если в про-
цедуре выполняется оператор:

  OnePtr := @One;

то ОnеРtr является указателем на переменную Тwо, а ОnеРtr^ -
ссылка на саму переменную Тwо.

     Использование операции @ для процедуры или функции

     Вы можете применять операцию @ к процедуре или функции.
При  этом  вы  получите  указатель на ее точку входа. В Тур-
бо-Паскале не предусмотрен механизм для использования такого
указателя.  Единственным применением указателя процедуры мо-
жет быть передача его программе на языке ассемблера для  ис-
пользования в операторе.

                       Вызовы функции

     Вызовы функции приводят к активизации функции, заданной
с  помощью  идентификатора  функции. Идентификатором функции
является любой идентификатор, использованный для обозначения
функции.
     Если в соответствующем описании функции содержится спи-
сок  формальных параметров то в вызове функции должен содер-
жаться список фактических параметров. Каждый параметр  подс-
тавляется  вместо  соответствующего  формального параметра в
соответствии с набором правил, который вводится в Главе 22.


                                - 18 -


                 -------------------------
Вызов функции -->! идентификатор функции !----------------->
                 ------------------------- !             ^
                                     -------             !
                                     ! ----------------  !
                                     ! !   список     !  !
                                     ->! фактических  !---
                                       ! параметров   !
                                       ----------------

                  ---    ------------------------    ---
Список факти- -->( ( )-->! фактический параметр !-->( ) )-->
 ческих пара-     ---  ^ ------------------------ !  ---
 метров                !          ---             !
                       ----------( , )<------------
                                  ---
                         -------------
Фактический параметр --->! выражение !-------------->
                      !  -------------            ^
                      !  ------------------------ !
                      ---! ссылка на переменную !--
                         ------------------------

     Приведем некоторые примеры вызовов функций:

  Sum(A,63)
  Maximum(147,J)
  Sin(X+Y)ь
  Зрз(И)
  Шрнцож(Фгекцф,Кжкийх)

                    Описатели множества

     Описатель множества определяет значения  множественного
типа  и  получается  путем  записи  выражений, заключенных в
квадратные скобки ([]). Каждое выражение определяет значение
множества.


                                - 19 -


                      ---                              ---
Описатель множества->( [ )----------------------------( ] )->
                      ---  !                        ^  ---
                           !  --------------------  !
                           -->! группа элементов !---
                            ^ -------------------- !
                            !        ---           !
                            --------( , )<----------
                                     ---


                   -------------
Группа элементов ->! выражение !--------------------------->
                   ------------- !                      ^
                                 !  ----   -----------  !
                                 ->( .. )->!выражение!---
                                    ----   -----------

     Обозначение [ ] означает пустое множество, тип которого
совместим  по  присваиванию  с типом любого множества. Любая
группа элементов, описанная, как х..у, объявляет  элементами
множества  все значения в диапазоне х..у. Если х больше, чем
у, то х..у не описывает никаких элементов и обозначает  пус-
тое множество.
     В конкретном описателе множества все значения выражения
в группах элементов должны быть одного перечислимого типа.
     Приведем некоторые примеры описателей множеств:

     [red, C, green]
     [1,5,10..K mod 12, 13, 23]
     ['A'..'Z', 'a'..'z', Chr(Digit+48)]

                    Приведение типа значений

     Тип выражения можно изменить на другой  тип  с  помощью
приведения типа значений.


                                - 20 -


                -------------   ---   -----------   ---
Приведение ---->!идент. типа!->( ( )->!выражение!->( ) )-->
типа значений   -------------   ---   ----------    ---

     Тип выражения и задаваемый тип должны оба  иметь  пере-
числимый  тип или тип указателей. Для перечислимых типов ре-
зультирующее значение получается путем преобразования  выра-
жения  (и возможной проверки на нахождение в допустимых гра-
ницах). Преобразование может привести к усечению или  увели-
чению  размера  исходного  значения в том случае, если вновь
определяемый тип отличается от типа выражения. В том случае,
когда значение расширяется, его знак всегда сохраняется. Та-
ким образом, значение является расширяемым по знаку.
     Синтаксис приведения типа значений  почти  совпадает  с
синтаксисом приведения типа переменных (см. раздел "Приведе-
ние типа переменных" в Главе 4). Однако при приведении  типа
значений  операции  производятся со значениями, а не с пере-
менными и, таким образом, могут не участвовать в ссылках  на
переменные.  То  есть за приведением типа значения не обяза-
тельно следуют квалификаторы. В частности,  приведение  типа
значений не должно встречаться в левой части оператора прис-
ваивания.
     Некоторые примеры приведения типа значений  включают  в
себя:

  Intereg('A')
  char(48)
  boolean(0)
  Color(2)
  IntPtr(@Buffer)
  BytePtr(Ptr($40,$49)



