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

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

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

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

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

В Borland Pascal поддерживаются две различные модели генерации кода для операций 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, вычисление второго выражения не выполняется.

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

Поскольку в стандартном Паскале не определяется, какую схему следует использовать для вычисления булевских выражений, то программы, зависящие от действия какой-либо конкретной схемы, в действительности не являются переносимыми. Однако, если пожертвовать переносимостью, то очень часто можно получить значительный выигрыш во времени выполнения и простоте, которую позволяет получить вычисление по короткой схеме.