User Tools

Site Tools


expressoes_logicas

São expressões booleanas (ou lógicas):

  • constantes do tipo boolean;
  • variáveis do tipo boolean;
  • funções cujo tipo de retorno seja boolean;

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:

  • E_1 = E_2
  • E_1 <> E_2
  • E_1 > E_2
  • E_1 >= E_2
  • E_1 < E_2
  • E_1 <= E_2

Se L_1 e L_2 são duas expressões booleanas, então as seguintes também são:

  • L_1 or L_2
  • L_1 and L_2
  • L_1 xor L_2
  • not L_1
  • (L_1)

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:

  • 1 = 2
  • 'A' = 'a'
  • 5 < 2
  • 3 <= 3
  • 'JOAO' > 'JOSE'
  • 2 + 3 <> 5
  • 'comp' <> 'COMP'
  • 11 > 4
  • 11 > 4
  • conhece_pascal and conhece_C
  • reprovouNota xor reprovouPresenca
  • (media >= 7) and (percentualFaltas <= 0.75)
  • (idade >= 65) or (tempo_servico >= 25)
  • not(chovendo) and (temperatura >= 30) or tem_cerveja
  • (a and not(b)) or (b and not(a))

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.

  • As operações entre parênteses ocorrem primeiro;
  • Em seguida, os operadores unários (not, - (unário));
  • Em seguida, os operadores multiplicativos (∗, /, div, mod, and);
  • Em seguida, os operadores aditivos (+, -, or, xor);
  • Em seguida, os operadores relacionais (=, <>, >, >=, <, <=);
  • Finalmente, realiza operações segundo otimizações do compilador.

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.

expressoes_logicas.txt · Last modified: 2019/04/24 11:38 by castilho