Diferença entre "! ==" e "==!" [fechadas]

162

Ontem me deparei com isso quando modifiquei o código PHP escrito por outra pessoa. Fiquei desconcertado por uma comparação simples ( if ($var ==! " ")) não funcionar como esperado. Após alguns testes, percebi que quem escreveu esse código usou em ==!vez de !==como operador de comparação. Eu nunca vi ==!em nenhum idioma, então me perguntei como diabos esse código poderia funcionar e fiz alguns testes:

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

Isso produz esta saída:

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

O operador parece funcionar para variáveis ​​booleanas e inteiras, mas não para seqüências de caracteres. Não consigo encontrar ==!na documentação do PHP nem nada sobre isso em nenhum mecanismo de pesquisa (tentei Google, Bing, DuckDuckGo, mas suspeito que eles tentem interpretá-lo em vez de procurar a string literal). Alguém já viu isso antes e pode lançar alguma luz sobre esse comportamento?

Gerald Schneider
fonte
57
vamos lá ... o que há com os votos positivos? Eu posso fazer mais uma dúzia de perguntas como essa. E acompanhe-os por uma análise quase séria. Esta é a prática padrão de exercícios de livros didáticos, não. Em SO, votamos em qualidade e informação, não em diversão e entretenimento.
sehe
51
@sehe Ele está recebendo votos positivos porque é a definição de uma pergunta bem pesquisada - ele "pesquisou profundamente por uma resposta", "foi específico", a pergunta é "relevante para os outros" e está "no tópico". o OP tentou as coisas e nos mostrou o que tentou; é o tipo de pergunta neste site tenta promover
JRaymond
11
@JRaymond: ele está recebendo votos positivos porque é uma pergunta trivial para um problema e resposta muito fáceis de entender. O aspecto trivial aumenta a curiosidade que atrai mais pessoas, e o aspecto fácil aumenta a porcentagem de pessoas que entendem a pergunta e a resposta suficiente para votar nela. Não está relacionado a ser uma boa pergunta ou não.
Thomas Bonini
4
@JRaymond, admita, a maioria das perguntas mais altas é trivial. Dê uma olhada nessas três perguntas minhas, entre muitas outras: 1 , 2 , 3 . Nenhum deles é algo que você pode encontrar no google (ao contrário da maioria das perguntas com mais votos) e é bem pensado e experimentado antes de ser escrito (eu sei, porque eu os escrevi). No entanto, como são perguntas que exigem conhecimento, nunca obtêm altos votos. É assim que o sistema aqui funciona.
Shahbaz
3
@JRaymond sehe está certo. Os escritores teriam um dia de campo no SO. Eu sugiro descer esta lista ( php.net/quickref.php ) e apresentar problemas interessantes em que a função é a solução. Quanto mais obscura e interessante a situação ou a função, mais votos.
Mike B

Respostas:

243

A diferença é que não há operador ==!.

Esta expressão:

$a ==! $b

É basicamente o mesmo que este:

$a == (!$b)
Bang Dao
fonte
10
Uau, muitas respostas boas em tão pouco tempo. Eu escolhi a primeira resposta que esclareceu que o! aplica-se à variável à direita e, portanto, tem o maior valor. Desculpem os outros caras;)
Gerald Schneider
4
@Gerald Schneider: O mínimo que você poderia fazer para compensar isso foi melhorar essa resposta, para que ela estivesse no mesmo nível das outras respostas em termos de gramática e formatação (uma das quais você pediu especificamente por sua explicação muito detalhada !). Mas não importa, eu editei agora.
BoltClock
Eu nem programa em PHP e até percebi que "==!" seria lido como os 2 operadores "==" e "!". Apenas mostra quanto efeito um pouco do layout pode ter na maneira como você lê algo.
StarNamer
2
@Bang Dao Um, JavaScript? Tem === e! ==. Mas não ==!
Psr
2
@BangDao Agora você encontrou outro motivo para o w3fools. Leia, é importante.
alguns
77

Não há ==!operador no PHP

É apenas uma combinação de ==e !. Somente o operador relevante presente aqui é ==. Portanto, a combinação ==!funcionará normalmente ==, verificando Equalitye confie em mim,

$variable_a ==! $variable_b 

não é outro senão

$variable_a == (!$variable_b)

e assim;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

E

true ==! false: bool(true)
true ==! true: bool(false)

A combinação de caracteres de vários operadores pode não funcionar como um operador sempre. por exemplo, se pegarmos =e !, ele funcionará como operadores apenas se estiver no padrão de !=ou !==. Pode haver inúmeras combinações para estes personagens como !====, !==!etc .. etc .. combinações operador deve estar em formato único , ordem única , combinações únicas (todos os caracteres não vai combinar com todos os outros caracteres) e, definitivamente, sem qualquer espaço entre eles .

Verifique a lista de operadores abaixo;

insira a descrição da imagem aqui

Alfredo
fonte
2
Eu caí na mesma ilusão de poder usar um <table>.
Chad Harrison
+ Quase pensei que era uma mesa ... mas a sua realmente uma imagem
Baba
38

==! não é um operador, mas dois:

== e !

! ter uma prioridade mais alta do que ==

Assim :

"a" !== " ": bool(true) -> verdadeiro porque "a" não é realmente igual a ""

"a" ==! " ": bool(false) -> false porque "a" não é igual a! ""

Pode ser escrito com um espaço entre == e!.

Michael Laffargue
fonte
1
false because "a" is not equals to !" "! "" significa converter para bool e negar que "" é verdadeiro e! "" é falso.
Zaffy 8/09/12
@quarry Sim eu não fui muito dentro da explicação: p
Michael Laffargue
29

==!não existe como tal. É uma notação um tanto enigmática de== !

Como os espaços não importam nessas operações, você pode escrever com a mesma facilidade a --> b, o que avalia a-- > b, mas parecerá estranho.

Então, quanto à pergunta: "a" ==! " "será analisado "a" == !" ". A negação de uma string é coberta pela conversão , significando qualquer string, mas "0"e " "é, quando convertida true,.

Assim, a expressão "a" == !" "será transferida:

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

E, como string "a"não é o mesmo bool true, isso avalia toda a expressão para false.

Então, qual é a moral da história? Não se deixe confundir com espaços ausentes ou errados! :)

FP
fonte
3
diferentemente do indicado nesta resposta, "a" == true é avaliado como true porque uma string não vazia é convertida no valor booleano true. A expressão "a" === true seria avaliada como false.
Pascal Rosin
25

==! não é um operador

==!não é um operador de comparação de php - é o mesmo que == !(observe o espaço)

Ou seja,

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}
AD7six
fonte