ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 8

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

   *, /, div, mod,           второй         операция умножения,
   and, shl, shr                             деления, сдвига...

   +, -, or, xor             третий           операция сложения
   =, <>, <, >,         четвертый (низший)   операция отношения
   <=, >=, in
   ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

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

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

                             ЪДДДДДДДДДДДДДДДДДДДДДДї
 множительДВДДДДДДДВДДДДДДДДДґ ссылка на переменную ГДДДДДДДДДДДД
           і       і        АДДДДДДДДДДДДДДДДДДДДДДЩ     
           і       і ХНННё і ЪДДДДДДДДДДДДДДДДДДДДДДДДДї і і
           і       Аі @ ГДЕі идентификатор процедуры ГДґ і
           і         ФНННѕ і АДДДДДДДДДДДДДДДДДДДДДДДДДЩ і і
           і               і ЪДДДДДДДДДДДДДДДДДДДДДДДї   і і
           і               Аі идентификатор функции ГДДДЩ і
           і                 АДДДДДДДДДДДДДДДДДДДДДДДЩ     і
           і  ЪДДДДДДДДДДДДДДДДДДДДДї                      і
           ГДі константа без знака ГДДДДДДДДДДДДДДДДДДДДДі
           і  АДДДДДДДДДДДДДДДДДДДДДЩ                      і
           і  ХНННё     ЪДДДДДДДДДДДДДДДї    ХНННё         і
           ГДі ( ГДДДДі   выражение   ГДДДі ) ГДДДДДДДДі
           і  ФНННѕ     АДДДДДДДДДДДДДДДЩ    ФНННѕ         і
           і  ХНННё      ЪДДДДДДДДДДДї                     і
           ГДіnotГДДДДДі множитель ГДДДДДДДДДДДДДДДДДДДДі
           і  ФНННѕ      АДДДДДДДДДДДЩ                     і
           і  ЪДДДДДДДДДДДДДДДї                            і
           ГДі вызов функции ГДДДДДДДДДДДДДДДДДДДДДДДДДДДі
           і  АДДДДДДДДДДДДДДДЩ                            і
           і  ЪДДДДДДДДДДДДДДДДДДДДДДДї                    і
           ГДі конструктор множества ГДДДДДДДДДДДДДДДДДДДі
           і  АДДДДДДДДДДДДДДДДДДДДДДДЩ                    і
           і  ЪДДДДДДДДДДДДДДДДДДДДДДДДДДї                 і
           АДі приведение типа значения ГДДДДДДДДДДДДДДДДДЩ
              АДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

     Вызов функции активизирует функцию и представляет собой значения, возвращаемые функцией (см. далее в этой главе раздел "Вызовы функций"). 
     Конструктор множества представляет собой значение множественного типа (см. раздел, озаглавленный, как "Описание множеств"). Приведение типа изменяет тип значения (см. "Приведение типа"). Беззнаковая константа имеет следующий синтаксис: 
                           ЪДДДДДДДДДДДДДДДДДї
 константа без знака ДДВДДі число без знака ГДДДДДДДДДДДДДДДДДД
                       і   АДДДДДДДДДДДДДДДДДЩ          
                       і   ЪДДДДДДДДДДДДДДДДДДДї        і
                       ГДДі символьная строка ГДДДДДДДДґ
                       і   АДДДДДДДДДДДДДДДДДДДЩ        і
                       і   ЪДДДДДДДДДДДДДДДДДДДДДДДДДї  і
                       ГДДі идентификатор константы ГДДґ
                       і   АДДДДДДДДДДДДДДДДДДДДДДДДДЩ  і
                       і   ХНННё                        і
                       АДДіnilГДДДДДДДДДДДДДДДДДДДДДДДДЩ
                           ФНННѕ

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

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

                        ЪДДДДДДДДДДДї
 терм ДДДДДДДДДДДДДДДДДі множитель іДДДДДДДВДДДДДДДДДДДДДДДДДДД
                       АДДДДДДДДДДДЩ       і
             і              ХНННё           і
             ГДДДДДДДДДДДДДДґ * іДДДДДДДДДДґ
             і              ФНННѕ           і
             і              ХНННё           і
             ГДДДДДДДДДДДДДДґ / іДДДДДДДДДДґ
             і              ФНННѕ           і
             і              ХНННё           і
             ГДДДДДДДДДДДДДДґdivіДДДДДДДДДДґ
             і              ФНННѕ           і
             і              ХНННё           і
             ГДДДДДДДДДДДДДДґmodіДДДДДДДДДДґ
             і              ФНННѕ           і
             і              ХНННё           і
             ГДДДДДДДДДДДДДДґandіДДДДДДДДДДґ
             і              ФНННѕ           і
             і              ХНННё           і
             ГДДДДДДДДДДДДДДґshlіДДДДДДДДДДґ
             і              ФНННѕ           і
             і              ХНННё           і
             АДДДДДДДДДДДДДДґshrіДДДДДДДДДДЩ
                            ФНННѕ

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

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

     В простых выражениях к термам применяются операции сложения и присваивания знака: 
                                           ЪДДДДДДї
 простое выражениеДДДДДДДДДДДДДДДДДДДДДДДДі терм ГДДДВДДДДДДДДД
                                          АДДДДДДЩ   і
                                       і              і
                                       і     ХНННё    і
                                       ГДДДДДґ + іДДДґ
                                       і     ФНННѕ    і
                                       і     ХНННё    і
                                       ГДДДДДґ - іДДДґ
                                       і     ФНННѕ    і
                                       і     ХНННё    і
                                       ГДДДДДґ orіДДДґ
                                       і     ФНННѕ    і
                                       і     ХНННё    і
                                       АДДДДДґxorіДДДЩ
                                             ФНННѕ

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

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

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

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

            ЪДДДДДДДДДДДДДДДДДДДї
 выражениеДі простое выражение ГДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
            АДДДДДДДДДДДДДДДДДДДЩ і                            
                                  і  ХНННё       ЪДДДДДДДДДДДї і
                                  ГДі < ГДДДДДДі простое   ГДЩ
                                  і  ФНННѕ      і выражение і
                                  і  ХНННё і     АДДДДДДДДДДДЩ
                                  ГДі <=ГДі
                                  і  ФНННѕ і
                                  і  ХНННё і
                                  ГДі > ГДі
                                  і  ФНННѕ і
                                  і  ХНННё і
                                  ГДі >=ГДі
                                  і  ФНННѕ і
                                  і  ХНННё і
                                  ГДі = ГДі
                                  і  ФНННѕ і
                                  і  ХНННё і
                                  ГДі <>ГДі
                                  і  ФНННѕ і
                                  і  ХНННё і
                                  АДі inГДЩ
                                     ФНННѕ

                            Операции

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

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

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

     Любая операция, включающая операнд, тип которого является подмножеством перечислимого типа, обрабатывается также, как если бы он был перечислимого типа. 
     Если оба операнда в операциях +, -, *, div или моd являются операндами целого типа, то тип результата будет таким же, как общий тип обоих операндов. (Определение общего типа см. в разделе "Целый тип" в Главе 3). 
     Если один или более операндов в операциях +, -, или * имеют вещественный тип, то тип результата будет вещественным, если использована директива компилятора {$N-}, или типом с повышенной точностью при использовании директивы компилятора {$N+}. 
     Если при использовании операции сохранения знака или операции отрицания знака операнд имеет целый тип, то результат будет тоже целого типа. Если операнд вещественного типа, то тип результата будет вещественным (real) или типом с повышенной точностью
 (extended). 
     Значение выражения x/y всегда будет вещественного типа (real) или с повышенной точностью (extended), независимо от типов операндов. Если y равно 0, то результат будет ошибочным. 
     Значение выражение i div j представляет собой математическое частное от i/j, округленное в меньшую сторону до значения целого типа. Если j равно 0, результат будет ошибочным. 
     Операция mod возвращает остаток, полученный путем деления двух ее операндов, то есть: 
     i mod j = i - (i div j) * j

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

     Типы логических операций показаны в Таблице 6.4.

                 Таблица 6.4 Логические операции
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
      Операция   Действие        Типа операндов  Тип результата
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
      not    Отрицание (битовое)    Целый            Целый
      and       И (битовое)         Целый            Целый
      or        ИЛИ (битовое)       Целый            Целый
      xor    Исключающее ИЛИ        Целый            Целый
                (битовое)
      shl      Сдвиг влево          Целый            Целый
      shr      Сдвиг вправо         Целый            Целый
     ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД

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

     Если операндом операции not является операнд целого типа, то результат будет также целого типа. 
     Если оба операнда в операциях or, and или xor целого типа, то тип результата будет таким же, как тип обоих операндов. 
     Операции 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 - полное вычисление и вычисление по короткой схеме (частичное вычисление). 
     При полном вычислении подразумевается, что каждый операнд булевского выражения, построенный с помощью операций or и and, всегда будет вычисляться, даже если результат всего выражения уже известен. Эта модель полезна в том случае, когда один или боле
е операндов в выражении представляют собой функции с побочными эффектами, которые изменяют смысл программы. 
     Вычисление по короткой схеме обеспечивает строгое вычисление слева направо. Это вычисление прекращается, как только результат всего выражения становится очевиден. Во многих случаях эта модель удобна, поскольку она обеспечивает минимальное время выпо
лнения и, как правило, минимальный объем кода. Вычисление по короткой схеме делает также возможными такие конструкции, которые в противном случае были ба недопустимы, например: 
     while (I<=Lenght(S)) and (S[I]<>' ') do
        Inc(I);
     while (P<>nil) and (P^.Value<>5) do
        P:=P^.Next;

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

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

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

     Расширенный синтаксис (директива компилятора {$X+}) поддерживает несколько новых операций над символьными указателями. Для увеличения или уменьшения смещения в значении указателя можно использовать операции плюс (+) и минус (-). Операцию минус (-) м
ожно использовать для вычисления расстояния (разности смещений) между двумя символьными указателями. Прпедположим, что P и Q представляют собой значения тип PChar, а I - значение типа Word. Тогда допустимы следующие конструкции: 
     P + I     I прибавляется к смещению P
     I + P     I прибавляется к смещению P
     P - I     I вычитается из смещения P
     P - Q     Смещение Q вычитается из смещения P

     В операциях P + I и I + P I прибавляется к адресу, задаваемому P. При этом получается указатель, который указывает на I символов после P. В операции P - I I вычитается из адреса, задаваемого P, и получается указатель, указывающий на I символов до P.
 
     Операция P - Q вычисляет расстояние между Q (младший адрес) и P (старший адрес). При этом возвращается результат типа Word, показывающий число символов между Q и P. Эта операция предполагает, что P и Q указывают на один и тот же массив символов. Есл
и эти два указателя указывают на разные символьные массивы, то результат непредсказуем. 
                    Операции над множествами

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

     Результаты операций соотвествуют правилам логики работы с множествами: 
     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 Операции отношения
    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
     Операция  Действие       Типы операндов     Тип результата
    ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
        =       Равно     Совместимый простой,        Булевский
                         указатель, множественный,
                         строковый или упакованный
                         строковый

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

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

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

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

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

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

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

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

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

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

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

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

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

     Расширенный синтаксис (разрешенный по директиве компилятора {$X+}) позволяет применять операции <, >, <= и <= к значениям PChar. Заметим, однако, что при таких проверках предполагается, что два сравниваемых указателя указывают на один и тот же масси
в символов. По этой причине сравниваются только смещения указателей. Если два указателя указывают на различные символьные массивы, то результат неопределен.
                       Сравнение множеств

     Если операндами являются множества a и b, то при их сравнении получаются следующие результаты: 
     1. Выражение a=b истинно (= True) только когда a и b содержат одни и те же элементы, в противном случае a<>b.
     2. Выражение a = b истинно, когда каждый элемент множества a является также элементом множества b.
     3. Выражение a = b истинно, когда каждый элемент множества b является также элементом множества a. 
             Проверка на принадлежность к множеству

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

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

     Операция @ является унарной операцией, в качестве операнда которой используется ссылка на переменную, процедура или идентификатор функции и операнду возвращается указатель. Тип этого значения является таким же, как тип указателя 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оо, поскольку он указывает на значение Fоо, которое было взято из Fоо и сохранено в стеке. 
        Использование операции @ для параметра-переменной

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

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

     Для получения указателя на точку входа в метод допускается применение операции @ к уточненному идентификатору метода. 
                         Вызовы функции

     Вызовы функции приводят к активизации функции, заданной с помощью идентификатора функции. Идентификатором функции является любой идентификатор, использованный для обозначения функции. 
     Если в соответствующем описании функции содержится список формальных параметров то в вызове функции должен содержаться список фактических параметров. Каждый параметр подставляется вместо соответствующего формального параметра в соответствии с наборо
м правил, который вводится в Главе 19 ("Вопросы ввода и вывода"). 
                  ЪДДДДДДДДДДДДДДДДДДДДДДДї
 вызов функции ДДі идентификатор функции іДВДДДДДДДДДДДДДДДДДДД
                  АДДДДДДДДДДДДДДДДДДДДДДДЩ і             
                                      ЪДДДДДЩ             і
                                      і                   і
                                      і ЪДДДДДДДДДДДДДДї  і
                                      і і   список     і  і
                                      Аі фактических  ГДДЩ
                                        і параметров   і
                                        АДДДДДДДДДДДДДДЩ

                  ХНННё   ЪДДДДДДДДДДДДДДДДДДДДДДї   ХНННё
  список     ДДДДі ( ГДДі фактический параметр ГДВі ) ГДДДДДД
  фактических     ФНННѕ  АДДДДДДДДДДДДДДДДДДДДДДЩ і ФНННѕ
  параметров            і         ХНННё            і
                        АДДДДДДДДДґ , іДДДДДДДДДДДЩ
                                  ФНННѕ
                          ЪДДДДДДДДДДДї
 фактический параметр ДВДі выражение ГДДДДДДДДДДДДДДДДДДДДДДДДД
                       і  АДДДДДДДДДДДЩ            
                       і                           і
                       і  ЪДДДДДДДДДДДДДДДДДДДДДДї і
                       АДДі ссылка на переменную ГДЩ
                          АДДДДДДДДДДДДДДДДДДДДДДЩ

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

     Sum(A,63)
     Maximum(147,J)
     Sin(X+Y)
     Eof(F)
     Volume(Radius, Height)

     Примечание: Функцию можно также вызывать через процедурную переменную. Подробности можно найти далее в разделе "Процедурные типы". 
     Синтаксис вызова функции теперь расширен и допускает вместо идентификатора функции использовать десигнатор метода или уточненный идентификатор метода. 
     Пояснение по расширению процедурных операторов, которое можно найти в Главе 7 ("Операторы процедуры") применимо также к вызовам функции. 
     В режиме  расширенного синтаксиса ($X+) вызовы функций можно использовать в качестве  операторов,  то  есть  результат  вызова функции может отбрасываться. 
     Примечание: подробности можно найти в Главе 21 ("Расширенный синтаксис"). 
                       Конструкторы множеств

     Конструктор (описатель) множества определяет значения множественного типа и получается путем записи выражений, заключенных в квадратные скобки ([]). Каждое выражение определяет значение множества. 
                         ХНННё                            ХНННё
 конструктор множества Ді [ ГДВДДДДДДДДДДДДДДДДДДДДДДДДДДґ ] ГДДДД
                         ФНННѕ і                         ФНННѕ
                               і                        і
                               і  ЪДДДДДДДДДДДДДДДДДДї  і
                               АДі группа элементов ГДВЩ
                                 АДДДДДДДДДДДДДДДДДДЩ і
                                і                      і
                                і       ХНННё          і
                                АДДДДДДДґ , іДДДДДДДДДЩ
                                        ФНННѕ

                    ЪДДДДДДДДДДДї
 группа элементов Ді выражение ГДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
                    АДДДДДДДДДДДЩ і                       
                                  і                       і
                                  і  ХНННё   ЪДДДДДДДДДї  і
                                  АДі ..ГДДівыражениеГДДЩ
                                     ФНННѕ   АДДДДДДДДДЩ

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

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

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

     Тип выражения можно изменить на другой тип с помощью приведения типа значений. 
                 ЪДДДДДДДДДДДї    ХНННё    ЪДДДДДДДДДї    ХНННё
 приведение ДДДДіидент. типаГДДДі ( ГДДДівыражениеіДДДі ) ГДД
 типа значений   АДДДДДДДДДДДЩ    ФНННѕ    АДДДДДДДДДЩ    ФНННѕ

     Тип выражения и задаваемый тип должны оба иметь перечислимый тип или тип указателей. Для перечислимых типов результирующее значение получается путем преобразования выражения (и возможной проверки на нахождение в допустимых границах). Преобразование 
может привести к усечению или увеличению размера исходного значения в том случае, если вновь определяемый тип отличается от типа выражения. В том случае, когда значение расширяется, его знак всегда сохраняется. Таким образом, значение является расширяемы
м по знаку. 
     Синтаксис приведения типа значений почти совпадает с синтаксисом приведения типа переменных (см. раздел "Приведение типа переменных" в Главе 4). Однако при приведении типа значений операции производятся со значениями, а не с переменными и, таким обр
азом, могут не участвовать в ссылках на переменные. То есть за приведением типа значения не обязательно следуют квалификаторы. В частности, приведение типа значений не должно встречаться в левой части оператора присваивания. 
     Некоторые примеры приведения типа значений включают в себя: 
     Intereg('A')
     char(48)
     boolean(0)
     Color(2)
     IntPtr(@Buffer)
     BytePtr(Ptr($40,$49)

                  Процедурные типы в выражениях

     В общем случае использование процедурной переменной в операторе или выражении означает вызов процедуры или функции, хранящейся в этой переменной. Однако, имеется исключение. Когда Турбо Паскаль видит, что процедурная переменная находится в левой час
ти оператора присваивания, он знает, что правая часть должна представлять собой процедурное значение. Рассмотрим в качестве примера следующую программу: 
     type
        IntFunc = function: Integer;
     var
        F: IntFunc;
        N: Integer;
     function ReadInt: Integer; far;
     var
        I: Integer;
     begin
        Read(I);
        ReadInt := I;
     end;
     begin
        F := ReadInt;      { присваивание процедурного значения }
        N := ReadInt;      { присваивание результата функции }
     end.

     Первый оператор основной программы присваивает процедурное значение (адрес процедуры) ReadInt процедурной переменной F, второй оператор вызывает ReadInt и присваивает N возвращаемое значение. Различие между получением процедурного значения или вызов
ом функции осуществляется по типу переменной, которой присваивается значение (F или N). 
     К сожалению, есть ситуации, когда компилятор не может определить из контекста желаемое действие. Например, в следующем операторе для компилятора не очевидно, что нужно сделать: сравнить процедурное значение в F с процедурным значением ReadInt, чтобы
 определить, что F указывает в данный момент на ReadInt, или вызвать F и ReadInt, а затем сравнить возвращаемые значения: 
     if F = ReadInt then
       WriteLn('Equal');

     Однако, стандартный синтаксис Паскаля определяет, что вхождение в выражение идентификатора функции означает вызов этой функции, поэтому в результате предыдущего оператора будет выполнен вызов F и ReadInt, а затем будут сравниваться возвращаемые знач
ения. Чтобы сравнить процедурное значение в F с процедурным значением в ReadInt, нужно использовать следующую конструкцию: 
     if @F = @ReadInt then
       WriteLn('Equal');

     При применении к процедурной переменной, идентификатору процедуры или функции операции получения адреса @ эта операция предотвращает вызов компилятором процедуры и в то же время преобразует аргумент в указатель. Таким образом, @F преобразует F в нет
ипизованный указатель-переменную, которая содержит адрес ReadInt. Для определения того, что F ссылается на ReadInt можно сравнить два значения-указателя. 
     Для получения адреса в памяти процедурной переменной, а не того адреса, который в ней хранится, нужно использовать двойную операцию получения адреса @@. Например, @P означает преобразование P в нетипизованный указатель-переменную, а @@P означает воз
вращение физического адреса переменной P. 


Яндекс цитирования