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!