not L1 and L2
будет воспринята компилятором как
(not L1) and L2,
в то время как, может быть, нужно было записать
not (L1 and L2).
С порядком логических вычислений тесно связана особая возможность Турбо Паскаля — поддержка двух различных моделей генерации кода для операций or и and — полное вычисление и вычисление по короткой схеме (частичное вычисление). При полном вычислении подразумевается, что каждый член логического выражения, построенного с помощью операций or и and, всегда будет вычисляться, даже если результат всего выражения уже известен. Вычисление по короткой схеме прекращается, как только результат всего выражения становится очевиден. Во многих случаях эта модель более удобна, поскольку она обеспечивает минимальное время выполнения и, как правило, минимальный объем кода. Вычисление по короткой схеме делает возможными такие конструкции, которые в противном случае были бы недопустимы, например:
if ( J <> 0 ) and ( ( 2/J ) > х ) then ... ;
while ( i <= Length(S) ) and ( S[i] <> ' ' ) do ... ;
В обоих случаях, если результатом первого вычисления будет значение False, вычисление второго выражения не выполняется (а если бы попыталось выполниться, то возникла бы ошибка).
- 173 -
Полная схема необходима лишь тогда, когда один или более операндов в выражении представляют собой логические функции с побочными эффектами, которые изменяют смысл программы, например:
if LogFunc(x) and LogFunc2(x) then ... ;
где LogFuncl и LogFunc2 — кроме анализа значения x, производят модификацию данных или выдачу сообщений.
Схема вычисления задается с помощью ключа компилятора $B. Обычно значением по умолчанию является состояние {$B-} (установленное в меню настройки компилятора Options/Compiler). В этом случае генерируется код с вычислением по короткой схеме. В случае директивы {$B+} генерируется код с полным вычислением.
Поскольку в стандартном Паскале не определяется, какую схему следует использовать для вычисления булевских выражений, программы, зависящие от действия какой-либо конкретной схемы, в действительности не являются переносимыми. Однако, если пожертвовать переносимостью, то можно получить значительный выигрыш во времени выполнения.
Типы операндов и результаты операций отношения (сравнения) приведены в табл. 9.5. Сравнивать можно совместимые простые значения, указатели, символы, строки. Подобие операций сравнения существует и для множеств. Результат операции отношения — всегда логическое значение True или False.
Таблица 9.5
| Название | Запись | Результат операции |
= | Равно | X1 = X2 | Логическое значение True, значения X1 и X2 равны, и False в противоположном случае |