- •Некоторые особенности языка TurboPascal
- •Расширения базового синтаксиса
- •Расширения типов данных
- •Объявления переменных
- •Типизированные константы
- •Выражения и операции
- •Операторы
- •Процедуры и функции
- •Модульное программирование в TurboPascal
- •Общие понятия о модулях
- •Структура модуля
- •Заголовок модуля
- •Раздел интерфейса
- •Раздел реализации
- •Раздел инициализации
- •Описание подключаемых модулей (Uses)
- •Локализация (видимость) имен
- •Компиляция и компоновка модулей
- •Пример программы с модулем
- •Библиотеки модулей
- •Стандартные модули TurboPascal
- •Перечень стандартных модулей
- •Ввод-вывод в TurboPascal
- •Понятие об объектно-ориентированном программировании
- •Концепция объектно-ориентированного программирования
- •Синтаксис объектов в TurboPascal
- •Использование объектов в программе
Выражения и операции
Выражения.
Определение терма – такое же, как в стандартном Паскале. Определение фактора дополнительно включает в себя операцию модификатор типа, в остальном, такое же, как в стандартном Паскале.
Таблица операций и приоритетов
|
Операции |
Приоритет |
Категория |
|
@ Not + – |
0 |
Одноместные (знаки) |
|
* / Div Mod And Shl Shr |
1 |
Мультипликативные |
|
+ – Or Xor |
2 |
Аддитивные |
|
= <> < > >= <= In |
3 |
Отношения |
К операциям стандартного Паскаля добавлены следующие операции:
@ – операция вычисления адреса переменной
Shl – операция побитного сдвига влево
Shr – операция побитного сдвига вправо
Xor – исключающее ИЛИ (результат True, если один из операндов имеет значение True, а другой имеет значение False. Если оба операнда имеют одинаковое значение, результат False.
Операции Not, And, Or, Xor в Turbo Pascal могут выполняться не только над данными типа Boolean, но и над данными любого целого типа. Аддитивная операция + определена также для строковых переменных и констант и в этом случае означает операцию конкатенации.
Подробнее об операциях, отсутствующих в стандартном Паскале.
Операция вычисления адреса.
Операция @ записывается перед именем процедур, функций, переменных и типизированных констант. Ее результат – адрес соответствующего объекта, тип – указатель. Значение адреса – 32 бита, из них 16 – адрес начала сегмента и 16 – смещение в сегменте. Применение этой операции к параметру-значению дает адрес этой переменной в стеке при выполнении процедуры или функции. Применение этой операции к параметру-переменной внутри процедуры или функции дает адрес фактического параметра, назначенного при вызове процедуры или функции.
Булевские и логические операции
В Turbo Pascal булевскими операциями называют операции над данными типа Boolean и дающие результат типа Boolean. Сюда относятся операции Not, And, Or, Xor.
Логическими операциями называются операции, выполняемые над операндами одного из целочисленных типов (в двухместных операциях оба операнда должны быть одного типа). Их результат – того же типа, что и операнды.
Логические операции выполняются побитно над каждым битом, или каждой парой битов в операндах. К логическим операциям относятся Not, And, Or, Xor, Shl, Shr.
Пример. Пусть объявлены переменные A и B типа Byte, пусть их текущие значения в двоичном виде будут следующие: A = 0001 0011, B = 0010 0010.
|
Операция |
Результат (в двоичном виде) |
|
Not A |
1110 1100 – инверсия каждого бита |
|
Shl A |
0010 0110 – сдвиг на 1 бит влево |
|
A And B |
0000 0010 – единицы только в тех битах, в которых есть единицы одновременно в обоих операндах |
|
A Or B |
0011 0011 – нули только в тех битах, в которых есть нули одновременно в обоих операндах |
|
A Xor B |
0010 0001 – единицы только в тех битах, значения которых в обоих операндах разные |
Логические операции можно использовать для широко применяемого приема программирования – наложения двоичных масок. Двоичные маски применяют для проверки состояния определенного бита, для установки части битов в 0 или 1 при сохранении значений остальных битов, для инверсии значений части битов при сохранении значений остальных битов. Потребность в таких операциях часто возникает при программировании взаимодействия с нестандартными устройствами ввода-вывода.
Например, если нужно проверить, установлен ли в единицу шестой бит в переменной B, можно выполнить операцию And с двоичной маской 0010 0000. В шестнадцатеричной записи это будет $20. Далее остается проверить, будет ли результат нулевым. Если нет, значит, этот бит установлен в единицу.
If B And $20 <> 0 then ...;
Если нужно изменить значение первого, второго и четвертого битов переменной A на противоположное, не меняя при этом значения остальных битов, можно выполнить операцию исключающего ИЛИ (Xor) с двоичной маской 0000 1011 (в 16-ричной записи, принятой в Turbo Pascal, это будет $B)
A:= A Xor $B;
Если нужно, чтобы старший, восьмой, бит переменной B был гарантированно установлен в единицу, и при этом не изменилось бы значение остальных битов, можно выполнить операцию Or с маской 1000 0000 (в 16-ричной записи: $80).
Полезно помнить, что операция сдвига влево на один бит эквивалентна умножению целого числа на 2, а операция сдвига вправо на один бит – целочисленному делению (div) на два. При этом операции сдвига выполняются намного быстрее, чем умножение и деление. Правда, при таком способе умножения не обнаруживается переполнение разрядной сетки, поэтому его можно использовать, если заведомо известно, что результат не превысит значение, максимально допустимое для данного типа.
Модификатор типа
Это операция, в результате которой значение одного типа может быть интерпретировано как значение другого типа.
модификатор типа::=<имя типа> "("<выражение>")".
Внешне эта операция похожа на вызов функции с одним параметром-значением, но выполняется по-другому. Просто значение выражения в скобках, какого бы типа оно ни было, интерпретируется как значение типа, указанного перед скобками. Единственное требование – тип, к которому преобразуется значение выражения, должен иметь столько же или больше битов в своем представлении, как и преобразуемый тип.
Примеры.
Integer('A') – эквивалент функции Ord('A').
Char(48) – эквивалент функции Chr(48).
Longint(@Buffer) – 32-битовый результат адресной операции преобразуется к длинному целому.
Конкатенация.
Это операция соединения (сцепления) строк. В Turbo Pascal она записывается знаком +. При этом к строке слева от знака присоединяется строка справа о т знака. Операнды могут быть строковыми константами и строковыми переменными.
Пример.
Var A: string;
. . . . . . . . . . .
A:= 'Money';
. . . . . . . . . . .
A:=A+'Changers';
Writeln(A);
В этом месте выводится MoneyChangers.
Операции отношения над строками.
Допустимы операции = <> > < >= <=
Строки равны, если содержат одинаковые последовательности символов. Одна строка больше другой, если в ней ближайший к началу строки символ имеет большее ординальное значение, чем символ на том же месте во второй строке, а предыдущие символы одинаковы.
Примеры.
'ABC'<'BAA' – истина, потому что в первой позиции символ B имеет большее значение, чем символ А.
'ABC'<'ABD' – истина, потому что в третьей позиции символ D имеет большее значение, чем символ C.
'ABC'<'ABCD' – истина, потому что в четвертой позиции строки справа есть символ D, а в строке слева вообще нет символов в 4-й позиции.
Вызов функций и процедур.
Начиная с версии 6.0 при включенной опции расширенного синтаксиса функции можно вызывать как процедуры (то есть, отдельным оператором). При этом результат функции, возвращаемый через ее имя, игнорируется.
Начиная с версии 5.5 добавлена возможность вызова функций и процедур, являющихся методами объектов, с применением квалификаторов.
Также процедуру или функцию можно вызывать по имени переменной процедурного типа, которой предварительно было присвоено имя процедуры или функции с соответствующей структурой заголовка.
Узнать, указывает ли переменная процедурного типа на определенную функцию, можно, сравнив адрес функции, на которую ссылается переменная и адрес интересующей функции: Пусть F – переменная процедурного типа, а ReadInt – процедура с такой же структурой заголовка, как и у переменной F.
If @F = @ReadInt then . . . ;
Чтобы узнать адрес процедурной переменной, а не функции, на которую она указывает, нужно применить операцию вычисления адреса дважды:
@@F
