=, == e === operadores de igualdade em linguagens fracamente tipadas

=, == e === operadores de igualdade em linguagens fracamente tipadas

Publicação: 21/01/2019
Área:Desenvolvimento Web e Mobile

=, == e === operadores de igualdade em linguagens fracamente tipadas

Em matemática, estamos acostumados a utilizar o símbolo de igual (=) para um operador de igualdade. Assim, x = 5 tem o mesmo significado de 5 = x, e basicamente nos informa que naquela equação, o valor de x é 5.

Em linguagens de programação imperativas temos uma situaçao ligeiramente diferente, e que pode confundir quem está recém aprendendo a programar, pois a igualdade, na maioria das linguagens, não é representada pelo símbolo (=), mas sim pelos símbolos (==) e mesmo (===).

Assim sendo, temos um dos comandos mais simples de uma linguagem de programação, e que intuitivamente, o programador leigo pode entender incorretamente. Vejamos um exemplo:

x = 5;

Na grande maioria das linguagens, incluindo C, Java, Javascript e PHP, este comando está correto, mas ele não significa uma igualdade entre x e 5. Na verdade, ele representa uma atribuição. O comando pode melhor ser traduzido para o português como "x recebe o valor 5", ou mesmo "x passa, a partir deste comando, a ter o valor 5".

Em que isso é diferente da matemática? Trata-se de uma atribuição e não de uma igualdade, tanto que é também correto nestas linguagens escrevermos o comando:

x = x + 1;

Em matemática teríamos uma equação que estaria incorreta, mas em programação temos apenas um comando que diz que "x passa a receber o seu próprio valor acrescido de 1", ou seja, estamos apenas aumentando em 1 o valor de x.

Logo, temos que utilizar outro comando para indicar a igualdade entre dois valores, e, o padrão da maioria das linguagens, para diferenciar da atribuição, foi utilizar o comando (==).

Assim sendo, assumindo que o valor de x seja 5, teremos que o comando a seguir é uma comparação que retorna o valor falso:

x == 6;

enquanto que o comando a seguir, com x valendo 5, retorna verdadeiro:

x == 5;

Embora, em linguagens fortemente tipadas, temos apenas a necessidade de distinguir entre atribuição e comparação de igualdade, em linguagens fracamente tipadas, temos uma questão adicional, como veremos a seguir





Conversão automática de tipos em linguagens fracamente tipadas, e o comando ===

Em linguagens fracamente tipadas, o tipo de um determidado dado, por exemplo atribuído a uma variável, não é necessariamente fixo, e é convertido conforme necessário.

Por exemplo, podemos ter uma variavel stringx com o valor de uma string "5", e a variavel inteirox com o valor de um número inteiro 5, conforme o exemplo a seguir:

stringx = "5";
inteirox = 5;

A pergunta é, estas variáveis tem ou não tem o mesmo valor. E a resposta na verdade pode depender, em determinado momento, do que queremos que o programa faça. Em linguagens fortemente tipadas, a variável stringx precisaria primeiro ser criada como uma string, e a variável inteirox precisaria ser criada como um inteiro. De outro modo, haveria um erro quando tentássemos fazer estas atribuições.

Nestes casos, não é possível compararmos stringx e inteirox. Em linguagens fortemente tipadas, primeiro temos que converter o valor de uma das variáveis para inteiro ou string, para então compararmos com o valor da outra variável.

Já em linguagens como Javascript e PHP, o interpretador da linguagem busca converter o tipo das variáveis para o valor mais adequado. Assim, o comando a seguir retornará verdadeiro:

"5" == 5; //retorna verdadeiro

É justamente quando queremos que o comando de igualdade só retorne verdadeiro para tipos iguais, sem converter automaticamente entre um tipo e outro, que utilizamos "===".

Assim sendo, o comando a seguir retorna falso, pois faz uma comparação entre um valor string e outro inteiro, e o comando "===" impede que haja uma conversão de tipos automática antes da comparação:

"5" === 5; //retorna falso