Anda di halaman 1dari 4

Operadores Lgicos

Todos os programas at agora consideraram if com condies de teste simples. Alguns exemplos de testes simples: b != 0, contador <= 5. Estas expresses testam uma condio. Portanto, quando mais de uma condio precisa ser testada, precisamos usar sentenas if e if-else aninhadas. A linguagem C , assim como a maioria das linguagens de programao de alto nvel suportam operadores lgicos que podem ser usados para criar operaes lgicas mais complexas, combinando condies simples. O valor de uma expresso lgica ou VERDADEIRO ou FALSO. Lembre que no h constantes lgicas VERDADEIRO e FALSO em C ; em expresses lgicas 0 interpretado como FALSO, e qualquer valor diferente de zero interpretado como VERDADEIRO. Os operadores lgicos so
!

NO lgico, operao de negao (operador unrio) E lgico, conjuno (operador binrio) OU lgico, disjuno (operador binrio).

&& ||

Por exemplo, se quisermos testar se um nmero num positivo e par, e imprimir uma mensagem como no exemplo anterior, podemos escrever:
if (num >= 0) if (num % 2 == 0) printf("Numero par nao negativo.\n");

Com os operadores lgicos isso pode ser simplificado:


if ((num>=0) && (num%2 == 0)) printf("Numero par nao negativo.\n");

A operao de negao, !, pode ser usado da seguinte forma:


!expresso

lgica: O valor a negao lgica da expresso dada. Por

exemplo:
!0 !1

1 0

Ns podemos usar o operador de negao lgica e escrever o exemplo acima como:

if (num>0 && !(num%2)) printf("Numero par nao negativo.\n");

Os dois operadores binrios operam sobre duas expresses lgicas e tem o valor 1 (verdadeiro) or 0 (falso). Os exemplos abaixo mostram o seu uso:
a==0 && b==0 a==0 || b==0

(verdadeiro se ambos a

== 0

eb

== 0,

portanto se a e b so 0)

(verdadeiro se pelo menos uma das variveis a or b for 0)

Uma expresso usando && verdadeira somente se ambos os operadores forem verdadeiros (no zero). Uma expresso usando || falsa somente se ambos os operadores forem falsos (zero). Verifique na Tabela 2 o resultado do uso de operadores lgicos:

Tabela 2: Resultado de uso de Operadores Lgicos

A precedncia do operador de negao lgica a mais alta (no mesmo nvel que o ``-'' unrio). A precedncia dos operadores lgicos binrios menor que a dos operadores relacionais, e mais alta que a operao de atribuio. O && tem precedncia mais alta que o ||, e ambos associam da esquerda para a direita (como os operadores aritmticos). Como a precedncia dos operadores lgicos menor que a dos operadores relacionais, no necessrio usar parnteses em expresses como:
x >= 3 && x <= 50 x == 1 || x == 2 || x == 3

A Tabela 3 mostra o quadro completo de precedncia de operadores aritmticos, relacionais e lgicos.

Tabela 3: Precedncia e associatividade de operadores Operador Associatividade

() ! - ++ -- (cast) & * / % + < <= > >= == != && || = += -= *= /= %=

esquerda para direita (unrios) direita para esquerda esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita direita para esquerda

No prximo exemplo, o programa verifica se as trs variveis lado1, lado2, e lado3, podem ser lados de um tringulo reto. Ns usamos o fato que os trs valores devem ser positivos, e que o quadrado de um dos lados deve ser igual a soma dos quadrados dos outros lados (Teorema de Pitgoras) para determinar se o tringulo reto.
#include <stdio.h> main() { int lado1, lado2, lado3; int s1, s2, s3; printf(``Entre com o tamanho dos lados do triangulo: ``); scanf(``%d %d %d'', &lado1, &lado2, &lado3); /* s1 s2 s3 calcula o quadrado dos lados */ = lado1*lado1; = lado2*lado2; = lado3*lado3;

/* testa a condicao para um triangulo reto */ if ( lado1>0 && lado2>0 && lado3 > 0 ) { if (s1==s2+s3 || s2==s1+s2 || s2==s1+s3) ) { printf("Triangulo reto!\n"); } else { printf("Nao pode ser um triangulo!\n"); } }

Na utilizao de expresses lgicas, as seguintes identidades so teis. Elas so chamadas de Lei de DeMorgan:
!(x && y)

equivalente a !x

|| !y

e
!(x || y)

equivalente a !x

&& !y