« Voltar
em c# java

Qual a diferença de usar && ou & em um if? || ou |? Como fazer um if ternário?.

Estamos acostumados à escrever ifs dessa forma:

if (condicao && outraCondicao)  
{
   //faz algo
}

if (condicao || outraCondicao)  
{
   //faz algo
}

Mas, dá pra trocar os && e || por & e |:

if (condicao & outraCondicao)  
{
   //faz algo
}

if (condicao | outraCondicao)  
{
   //faz algo
}

Mas qual a diferença?

Operadores de curto circuito

Vamos olhar esse código:

int a = 1;  
int b = 2;  
if (a < 0  && b > 0)  
{
   //faz algo
}

Só entraremos nesse if se a for menor que 0 e b for maior que 0. Ou seja, as duas expressões tem que retornar true.
Nesse exemplo besta que eu fiz, a primeira parte retorna false, certo? Isso significa que não importa o que a segunda parte retornar, não tem como entrar no if.

Sendo assim, a segunda parte não será avaliada. Falamos que dá um "curto circuito" depois que a primeira condição é avaliada.

Agora, se usássemos o ||:

int a = 1;  
int b = 2;  
if (a < 0  || b > 0)  
{
   //faz algo
}

Nesse caso entraremos no if se a primeira condição retornar true ou se a segunda retornar true.

Ou seja, se a primeira já retornar true, nem precisamos avaliar o resto, certo?
E é exatamente isso que acontece, a segunda parte é ignorada (:

Quando usamos os operadores & e |, as duas condições sempre são avaliadas.
Difícil ter que fazer isso né?

Eu, pelo menos, nunca precisei.
E você?

if ternário

Vamos pegar o seguinte código de exemplo:

int a = 1;  
int b = 2;

if (a > 0 && b > 0)  
{
   int c = 1;
}
else  
{
   int c = 100;
}

(não leve em consideração que esse código é inútil, é só um exemplo)

Esse é um if relativamente simples, certo?
Podemos quebrar ele em uma linha usando um if ternário.

Ficaria assim:

int a = 1;  
int b = 2;  
int c = a > 0 && b > 0 ? 1 : 100;  

Essa linha significa:
Crie uma variável do tipo int chamada c. Se a for maior que zero e b também(?), atribua 1 pra ela. Senão(:), atribua 100.

Legal, né? Dá pra simplificar vários ifs dessa forma (:


Quer ficar em dia com os meus posts e novidades? Se inscreva na minha newsletter, me segue no Twitter e na minha página!

comments powered by Disqus