Envolvem operadores relacionais
- igual, maior, menor, diferente
São sobrecarregados para diversos tipos de dados primitivos
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
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)) ...
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
Considere o seguinte exemplo
indice = 1;
tamanho = 10;
while ((indice < tamanho) && (lista[indice] != chave)){
indice++;
}
O que aconteceria sem 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
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) { ... }