Dúvidas sobre lógica usando if

Olá!

Estou fazendo alguns exercícios básicos em Java (static initialization blocks) e não entendi por qual razão meu if não funcionou quando eu inverti a condição…

Preciso testar se as variáveis são maiores e diferentes de zero.

Se faço a condição assim, os testes funcionam!

        if (Main.b > 0 && Main.h > 0){
            System.out.println(Main.b * Main.h);
        } else {
            System.out.println("O valor precisa ser maior e diferente de zero");
        }```

Se faço assim… ele ignora a primeira condição e cai direto no else… calculando a área de números negativos.

    if ((Main.b <= 0) && (Main.h <= 0)){
        System.out.println("O valor precisa ser maior e diferente de zero");
    } else {
        System.out.println(Main.b * Main.h);
    }```

Alguém consegue me falar o que estou fazendo de errado?

Obrigada!

Quais os valores que você atribuiu a Main.b e Main.h?

1 curtida

As condições não são equivalentes.

No primeiro código ele só entra no if se ambas as condições forem satisfeitas: tanto b quanto h precisam ser maiores que zero. Se apenas um deles não for, cai no else.

Para deixar mais claro, temos 4 possibilidades:

  1. b e h são maiores que zero
  2. b é maior que zero, h não
  3. h é maior que zero, b não
  4. b e h são menores ou iguais a zero

O if (Main.b > 0 && Main.h > 0) indica que só pode entrar no if se estiver no caso 1. Em qualquer outro caso, entra no else.


Já o segundo código verifica se ambos são menores ou iguais a zero. Ou seja, if ((Main.b <= 0) && (Main.h <= 0)) indica que só vai entrar no if se estiver no caso 4.

Se um dos números for maior que zero e o outro for menor ou igual, ele entra no else.

Para corrigir, a ideia é que entre no if se pelo menos um deles for menor ou igual a zero (não necessariamente os dois, somente um já é suficiente). Então deve-se trocar o && (and) por || (or):

if (Main.b <= 0 || Main.h <= 0) {
    System.out.println("O valor precisa ser maior e diferente de zero");
} else {
    System.out.println(Main.b * Main.h);
}

Repare também que não precisa de tantos parênteses, pois os operadores && e || possuem precendência menor que as comparações.

Agora ele entra no if nos casos 2, 3 e 4, pois basta que uma das condições seja satisfeita:

  • se b for menor ou igual a zero, não importa o valor de h (cobre os casos 3 e 4)
  • se h for menor ou igual a zero, não importa o valor de b (cobre os casos 2 e 4)
1 curtida

Obrigada!!!

Eu tinha que ter mudado o operador lógico && para ||…
Eu estava testando o segundo código com -1 e 5… e por causa do && ele acabava entrando no else, é tão óbvio agora! : )
De qualquer forma, obrigada!