Ajude nosso projeto a se manter online.

Operadores Lógicos em C++: AND (&&), OR (||) e NOT (!)

Baixar a apostila C++ Progressivo
Neste tutorial de nosso curso de C++, vamos aprender mais três operadores, chamados operadores lógicos, que nos permitirão fazer testes mais complexos e interessantes. São eles:

  • && - AND ou E
  • || - OR ou OU
  • ! - NOT ou de negação


Operador Lógico AND: &&

O operador && serve para unir duas expressões lógicas em uma só, assim:

  • expressão1 && expressão2
O resultado dessa expressão é verdade somente se a expressão1 E a expressão2 forem verdadeiras.
Se qualquer uma delas for falsa, a expressão geral se torna falsa também.

A tabela verdade do operador && é:
Tabela verdade do operador lógico &&

Por exemplo, para você doar sangue, precisa ser de duas condições:
Ser maior de idade
Não ter doenças

Ou seja, pra dor você precisa ser maior E TAMBÉM não ter doenças:
  • maioridade && não ter doenças

Se qualquer uma dessas condições não for satisfeita (for false), você não pode doar sangue.
Vamos refazer o programinha que diz se é obrigatório você votar ou não.

Para ser obrigatório, deve satisfazer duas condições:
Ter 18 anos ou mais
Ter menos de 65 anos

Ou seja, precisa ter 18 anos E (AND) precisa ter menos de 65 anos.
Nosso código C++ fica assim:

#include <iostream>
using namespace std;

int main()
{
    int age;

    cout <<"Sua idade: ";
    cin >> age;


    if( age>=18 && age<65 )
        cout << "Obrigatório votar.";
    else
        cout << "Voto facultativo";


    return 0;
}

Veja que ficou bem mais enxuto, pois fizemos dois testes condicionais de uma vez só dentro do IF.
Se a pessoa tiver menos de 18 anos, a primeira expressão vai dar falsa e o teste inteiro se torna falso, indo pro ELSE.
Se ela tiver 65 ou mais, a segunda expressão já se torna falsa, deixando o resultado do IF falso também, indo pro ELSE.
Em ambos casos, o voto é facultativo.


Operador Lógico OR: ||

O operador lógico || (OU) une duas expressões assim:
expressão1 || expressão2

Ele retorna verdadeiro se qualquer uma das expressões forem verdadeiras.
Ou seja, só retorna falso se ambas forem falso. Confira a tabela verdade deste operador:

Curso de C++

Por exemplo, se numa rodovia a velocidade máxima é de 80 km/h, andar acima disso e abaixo da metade (40 km/h) dá multa. Vamos testar:

  • velocidade > 80 || velocidade < 40


Ou seja: se a velocidade for maior que 80 km/h OU for abaixo de 40 km/h, o motorista vai levar uma multa. Se alguma das expressões for verdadeira, o teste inteiro é verdadeiro.

Veja um programa que recebe a velocidade de um carro e diz se vai gerar multa ou não:
#include <iostream>
using namespace std;

int main()
{
    int speed;

    cout <<"Velocidade: ";
    cin >> speed;


    if( speed>80 || speed<40 )
        cout << "Vai levar multa.";
    else
        cout << "Tudo ok.";


    return 0;
}
O IF detecta se você vai levar multa, ou seja, pra não levar precisa cair no ELSE, e só cai no ELSE se ambas as expressões forem falsas, logo, você não está nem acima de 80 nem está abaixo de 40, logo está entre 40 e 80, que é o correto. Sacou ? OU uma coisa OU outra.

Operador Lógico NOT: !

Por fim, temos o operador de negação.
Ele transforma o que é falso em verdadeiro, e o que é verdadeiro em falso.

Veja a tabela verdade dele:
Operador de negação !
Ou seja:
!true é o mesmo que false
!false é o mesmo que true

Refazendo o primeiro código:
#include <iostream>
using namespace std;

int main()
{
    int age;

    cout <<"Sua idade: ";
    cin >> age;


    if( !(age>=18 && age<65) )
        cout << "Voto facultativo.";
    else
        cout << "Obrigatório votar";


    return 0;
}
Refazendo o segundo código:
#include <iostream>
using namespace std;

int main()
{
    int speed;

    cout <<"Velocidade: ";
    cin >> speed;


    if( !(speed>80 || speed<40) )
        cout << "Tudo ok.";
    else
        cout << "Vai levar multa.";


    return 0;
}
Pode parecer mais complicado ou a mesma coisa, de fato é a mesma coisa, mas muitas vezes vai ser mais lógico e vai fazer mais sentido usar o operador NOT em alguns testes condicionais. Veremos isso algumas vezes, no decorrer de nosso curso de C++.

A precedência de operadores entre eles é, de cima pra baixo:
!
&&
||

Exercício de Operadores Lógicos

No tutorial passado, sobre IF e ELSEs aninhados, propusemos uma questão sobre converter uma nota numérica em A, B, C... mas tem um bug ali.

E se o usuário digitar menos que 0 ou mais que 10?
É um erro. Ajeite o programa usando o operador lógico || para caso digitem notas abaixo de 0 ou acima de 10.

Nenhum comentário:

Postar um comentário