Como utilizar operadores lógicos em qualquer línguagem?
Os operadores lógicos são fundamentais para qualquer linguagem de programação, uma vez que permitem combinar condições e tomar decisões com base em múltiplas expressões booleanas. Embora a sintaxe varie ligeiramente consoante as linguagens, os operadores lógicos básicos são geralmente os mesmos.
Abaixo estão os principais operadores lógicos utilizados nas linguagens de programação:
AND: Devolve true
se ambas as condições forem verdadeiras.
Python, JavaScript, PHP: and
C++, C#: &&
Lua: and
#python
if a > 5 and b < 10:
print("Both conditions are true")
OR: Retorna true
se qualquer uma das condições for verdadeira.
Python, JavaScript, PHP: or
C++, C#: ||
Lua: or
//javascript
if (a > 5 || b < 10) {
console.log("One of the conditions is true");
}
NOT: Inverte o valor lógico, devolvendo true
se a condição for falsa e falso se for verdadeira.
Python, JavaScript, PHP: not
C++, C#: !
Lua: not
//php
if (!($a > 5)) {
echo "The condition is false";
}
XOR (OR exclusivo): Devolve true
se exatamente uma das condições for verdadeira.
- Python: Não existe um operador
XOR
nativo, mas é possível usar o operador!=
ou expressões booleanas. - C++:
^
- PHP:
xor
- JavaScript: Não existe um operador
XOR
nativo, mas pode utilizar a expressãoa ^ b
para valores numéricos.
//php
if ($a xor $b) {
echo "One of the conditions is true, but not both";
}
Estes operadores são utilizados para controlar o fluxo dos programas, principalmente em estruturas condicionais (if
, else
, while
, etc.). A maioria das linguagens também tem regras de precedência para os operadores, em que AND
é normalmente avaliado antes de OR
, exceto se existirem parênteses para alterar esta ordem.
Complementando, tem alguns detalhes que mudam conforme a linguagem.
Por exemplo, em Java e C#, os operadores lógicos só aceitam operandos booleanos. Já em outras linguagens, como Python, PHP e JavaScript, eles aceitam operandos de qualquer tipo.
Isso porque em Python, PHP e JavaScript existe o conceito de valores truthy e falsy, ou seja, qualquer valor pode ser convertido para true
ou false
se estiver em um contexto booleano.
Então valores como a string vazia, null
/None
e o número zero geralmente são considerados false
, enquanto os demais valores são considerados true
. Essas regras são definidas por cada linguagem e podem haver variações, como por exemplo a string "0"
, que em PHP é considerado false
, enquanto que em Python e JavaScript é considerado true
(nessas, somente o número zero é false
, mas a string "0"
não, porque não é vazia). Ou a lista vazia, que em Python é "falsa", mas em JavaScript um array vazio é considerado "verdadeiro".
Ou seja, algo como por exemplo if (a && b)
é válido em JavaScript, independente do valor das variáveis a
e b
, mas em Java só seria válido se o tipo dessas variáveis fosse boolean
.
Outro detalhe importante é que nem sempre o resultado do operador é um boolean
. Em Python e JavaScript, por exemplo, o retorno sempre é um dos operandos. Exemplo:
# Em Python, operadores and e or retornam um dos operandos
a = 'abc'
b = 42
c = a and b
print(c) # 42
d = a or b
print(d) # abc
No caso do and
, se o primeiro operando for verdadeiro (seja booleano, ou qualquer valor que seja correspondente a True
), o resultado é o valor do segundo operando (caso contrário, retorna o valor do primeiro). E o or
retorna o primeiro operando se este for verdadeiro, senão retorna o segundo.
Então quando fazemos if a and b:
em Python, a expressão a and b
retorna um dos valores de a
ou b
, e em seguida este é convertido para boolean
para verificar se ele corresponde a "verdadeiro" ou "falso". Mas como podemos ver no exemplo acima, é possível usar o valor retornado diretamente, sem que este necessariamente faça parte de uma condição.
Por isso que é comum termos, por exemplo, coisas assim em JavaScript:
var x = valor1 || valor2 || valor3;
Ou seja, x
recebe o primeiro dos valores que não for equivalente a false
, ou o último, caso todos os anteriores sejam (lembrando que valores como o número zero, string vazia, null
e undefined
são considerados "falsos"). No caso, o código acima seria equivalente a:
var x;
if (valor1) {
x = valor1;
} else if (valor2) {
x = valor2;
} else {
x = valor3;
}
Já em outras linguagens (como Java, C# e PHP), o retorno destes operadores sempre é um boolean
(ou seja, apenas true
ou false
).
E uma curiosidade: PHP tem tanto os operadores and
/or
quanto &&
/||
. A diferença entre eles é a precedência.
Vale lembrar também que esses operadores costumam ser short-circuit, ou seja, só avaliam o mínimo necessário. Por exemplo, a && b
só é verdadeiro se ambos os operandos também o forem. Então se o primeiro é falso, ele nem avalia o segundo. Já a || b
só é falso se ambos também o forem, então se o primeiro for verdadeiro, ele nem avalia o segundo.
Exemplo em JavaScript:
function a() {
console.log('chamando a()');
return false;
}
function b() {
console.log('chamando b()');
return true;
}
console.log('testando &&');
console.log(a() && b()); // a() retorna false, então nem chama b()
console.log('\ntestando ||');
console.log(b() || a()); // b() retorna true, então nem chama a()
A saída é:
testando &&
chamando a()
false
testando ||
chamando b()
true
Por fim, o XOR do JavaScript é apenas um operador bitwise, ou seja, ele trabalha com operandos numéricos e faz o XOR bit a bit dos seus valores. Por exemplo, se tivermos 14 ^ 9
, o resultado é 7
:
14 (00001110)
9 (00001001)
----------------
7 (00000111) <-- XOR bit a bit
É claro que se os números forem iguais (como 2 ^ 2
) o resultado será 0
, que equivale a false
. Mas se os valores não forem números, como por exemplo 'a' ^ ''
, o resultado também é zero (se o operador fosse lógico, o resultado deveria ser equivalente a true
, já que a string 'a'
é considerada verdadeira, enquanto a string vazia é falsa).
No caso, para simular o XOR lógico em JavaScript, teria que fazer algo como if (Boolean(a) !== Boolean(b))
(ou if (!a !== !b)
, já que o uso do operador !
força a coerção para booleano).
Só faltou o xor do lua que é feito por bitwise tirando isso, é interresante como cada linguagem pode variar minimamente mas no final o conceito é o mesmo, acho que depois que você domina uma linguagem por completo fica mais fácil aprender qualquer linguagem pois você conhece os conceitos so se deparar com algo diferente/novo que não tinha na linguagem que usava, depois de se acostumar com a sintaxe você aprende as peculiaridades da linguagem(esse comentario depois da virgula não teve muito haver mas achei legal falar sobre)