São expressões booleanas (ou lógicas):
Se E_1 e E_2 são duas expressões aritméticas, ou variáveis ou constantes do mesmo tipo, então as seguintes são expressões booleanas:
Se L_1 e L_2 são duas expressões booleanas, então as seguintes também são:
Somente são expressões booleanas as que podem ser construídas com as regras acima.
Os símbolos =, <>, >, >=, <, <=, são operadores relacionais binários. Podem ter como argumento expressões aritméticas ou então variáveis ou constantes do tipo, mas sempre resultam em tipo boolean.
Os símbolos and, or, xor e not são operadores booleanos, os dois primeiros são binários e o último é unário. Significam, respectivamente, as operações booleanas de conjunção, disjunção, disjunção exclusiva e negação.
A tabela abaixo explica cada um destes símbolos.
\vspace*{\baselineskip}
operador | significado |
= | igual |
<> | diferente |
>= | maior ou igual |
< | menor |
<= | maior ou igual |
and | conjunção |
or | disjunção |
xor | disjunção exclusiva |
not | negação |
O tipo do retorno sempre é boolean e o resultado da operação segue as regras da lógica clássica que são resumidas nas tabelas verdade apresentadas abaixo.
\vspace*{\baselineskip}
AND
Expressão | Resultado |
---|---|
false and false | false |
false and true | false |
true and false | false |
true and true | true |
OR
Expressão | Resultado |
---|---|
false or false | false |
false or true | true |
true or false | true |
true or true | true |
XOR
Expressão | Resultado |
---|---|
false xor false | false |
false xor true | true |
true xor false | true |
true xor true | false |
NOT
Expressão | Resultado |
---|---|
not false | true |
not true | false |
As expressões podem ser utilizadas nos seguintes casos:
São exemplos de expressões booleanas bem formadas:
Ordem de precedência:
Assim como acontece com as expressões aritméticas (seção Expressões aritméticas), as expressões lógicas também precisam de uma ordem de precedência entre os operadores para evitar ambiguidades na interpretação da expressão.
Observação:
Segundo o guia de referência, em sua versão de dezembro de 2008, o compilador Free Pascal, contrariamente ao Turbo Pascal, não consegue garantir a precedência quando avalia expressões de mesma prioridade, antigamente se fazia da esquerda para direita, mas o Free Pascal informa que o compilador decidirá qual avaliar primeiro baseado em regras de otimização. Assim, na expressão seguinte:
a := g(3) + f(2);
$f(2)$ pode ser executada antes de $g(3)$. Se o programador quiser garantir que $g(3)$ ocorra antes, deve escrever seu código assim:
e1 := g(3); a := e1 + f(2);
Sempre que for feita a construção de expressões lógicas contendo expressões aritméticas em conjunto com operadores relacionais, as sentenças contendo operadores relacionais precisam estar entre parênteses, ou o compilador vai gerar erro de execução. Por exemplo, na expressão:
a < 0 or b < 0
O operador or possui maior precedência em relação aos operadores relacionais. Assim, o compilador tenta realizar primeiro a expressão 0 or b. O operador or não foi construído para operar com dados numéricos, mas apenas com dados do tipo boolean, o que gera erro.
A maneira correta de construir a expressão é utilizar parênteses para separar as sentenças relacionais, da seguinte maneira:
(a < 0) or (b < 0)
Deste modo, como os parênteses possuem maior precedência em relação ao or, as sentenças relacionais são reduzidas a valores lógicos antes da utilização do operador.