Skip to content

Latest commit

 

History

History
109 lines (105 loc) · 2.76 KB

logicas.org

File metadata and controls

109 lines (105 loc) · 2.76 KB

Expressões Lógicas

1 Relacionais

Envolvem operadores relacionais

  • igual, maior, menor, diferente

São sobrecarregados para diversos tipos de dados primitivos

2 Lógicas

Envolvem variáveis lógicas, constantes lógicas, expressões relacionais lógicas, e operadores lógicos

  • And, Or, Not (Or exclusivo, equivalência)

Possuem ordem de precedência

  • Not
  • And
  • Or

Ausência do tipo booleano em C, usa-se outro tipo

int falso = 0;
int verdadeiro = !0;
  • Associação da esquerda para direita
    • útil em curtos-circuitos

3 Lógicas

Algumas consequências interessantes em C

int x = (a > b > c)
while (!feof(fd));
while (resultado = fread(fd));

Em Objective-C

NSEnumerator *en = [conjunto objectEnumerator];
id object;
while ((object = [en nextObject]));

\pause The Linux Backdoor Attempt in 2003

if ((options == (__WCLONE|__WALL)) &&
          (current->uid = 0)) ...

4 Avaliação em curto-circuito

Atalho quando o resultado de uma expressão é determinado por uma parte dela Exemplos

(13 * a) * (b / 13 - 1)
(a >= 0) && (b < 10)

Técnica mais utilizada em expressões lógicas

5 Avaliação em curto-circuito

Considere o seguinte exemplo

indice = 1;
tamanho = 10;
while ((indice < tamanho) && (lista[indice] != chave)){
   indice++;
}

O que aconteceria sem avaliação em curto-circuito?

6 Avaliação em curto-circuito

Desvantagem?

\pause Expressões com efeitos colaterais podem não ser executadas

  • Exemplo
    (a > b) || (b++ / 3)
        

\pause Observações

  • C/C++/Java avaliam && e || por curto-circuito
  • Ada
    and
    or //sem curto circuito
    and then
    or else //com curto circuito
        

7 Operador booleano versus bit-a-bit

Em Java, && e || são sempre lógicos
→ trabalham com expressões lógicas

int a; boolean b;
if ((a>10) && b) { ... }
if (a && b) { ... }

\pause & e | trabalham com bits

  • Não são avaliadas com curto-circuito
    int a = 1, b = 2;
    if (a & b) { ... }