Diferencia entre "! ==" y "==!" [cerrado]

162

Ayer me topé con esto cuando modifiqué el código PHP escrito por otra persona. Me desconcertó que una comparación simple ( if ($var ==! " ")) no funcionara como se esperaba. Después de algunas pruebas, me di cuenta de que quien escribió ese código lo usó en ==!lugar de !==como operador de comparación. Nunca he visto ==!en ningún idioma, así que me pregunté cómo demonios podría funcionar este código e hice algunas pruebas:

<?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");
?>

Esto produce esta salida:

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)

El operador parece funcionar para variables booleanas y enteras, pero no para cadenas. No puedo encontrar ==!en la documentación de PHP ni nada al respecto en ningún motor de búsqueda (probé Google, Bing, DuckDuckGo, pero sospecho que intentan interpretarlo en lugar de buscar la cadena literal). ¿Alguien ha visto esto antes y puede arrojar alguna luz sobre este comportamiento?

Gerald Schneider
fuente
57
vamos ... ¿qué pasa con los votos a favor? Puedo hacer una docena de preguntas más como esta. Y acompañarlos por un análisis cuasi serio. Esta es una práctica estándar de ejercicios de libros de texto, no. En SO, votamos por calidad e información, no por diversión y entretenimiento.
sehe
51
@sehe Él está recibiendo votos porque es la definición de una pregunta bien investigada: ha "buscado minuciosamente una respuesta", "ha sido específico", la pregunta es "relevante para los demás" y está "en el tema". el OP ha intentado cosas y nos ha mostrado lo que ha intentado; es el tipo de pregunta que este sitio intenta fomentar
JRaymond
11
@JRaymond: está recibiendo votos positivos porque es una pregunta de trivia para un problema y una respuesta muy fáciles de entender. El aspecto de trivia aumenta la curiosidad que atrae a más personas, y el aspecto fácil aumenta el porcentaje de aquellas personas que entienden la pregunta y la respuesta lo suficiente como para votarla. No está relacionado con que sea una buena pregunta o no.
Thomas Bonini
44
@JRaymond, admítelo, la mayoría de las preguntas de alto voto son triviales. Eche un vistazo a estas tres preguntas mías entre muchas otras: 1 , 2 , 3 . Ninguno de ellos es algo que podría encontrar en Google (a diferencia de la mayoría de las preguntas de alto voto) y están bien pensadas y probadas antes de ser escritas (lo sé, porque las escribí). Sin embargo, dado que son preguntas que requieren experiencia, nunca obtienen votos altos. Así es como funciona el sistema aquí.
Shahbaz
3
@JRaymond sehe tiene razón. Los escritores tendrían un día de campo sobre SO. Sugeriría ir a esta lista ( php.net/quickref.php ) y encontrar problemas interesantes donde la función es la solución. Cuanto más oscura e interesante sea la situación o función, más votos.
Mike B

Respuestas:

243

La diferencia es que no hay operador ==!.

Esta expresión:

$a ==! $b

Es básicamente lo mismo que esto:

$a == (!$b)
Bang Dao
fuente
10
Wow, muchas buenas respuestas en tan poco tiempo. Elegí la primera respuesta que aclaraba que el! se aplica a la variable de la derecha y, por lo tanto, tiene el mayor valor. Perdón por los otros chicos;)
Gerald Schneider
44
@Gerald Schneider: Lo menos que podía hacer para compensarlo era mejorar esta respuesta para que al menos estuviera a la par con las otras respuestas en términos de gramática y formato (una de las cuales solicitó específicamente su explicación muy detallada !). Pero no importa, lo he editado ahora.
BoltClock
Ni siquiera programo en PHP e incluso me di cuenta de que "==!" se leería como los 2 operadores "==" y "!". Solo muestra cuánto efecto puede tener un poco de diseño en cómo lees algo.
StarNamer
2
@Bang Dao Um, JavaScript? Tiene === y! ==. Pero no ==!
psr
2
@BangDao Ahora encontró otra razón para w3fools Léalo, es importante.
algunos
77

No hay ==!operador en PHP

Es solo una combinación de ==y !. Solo el operador relevante presente aquí es ==. Entonces, la combinación ==!funcionará de manera normal ==, comprobando Equalityy confía en mí,

$variable_a ==! $variable_b 

no es otro que

$variable_a == (!$variable_b)

y por lo tanto;

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

Y

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

La combinación de varios operadores de caracteres puede no funcionar como un operador siempre. por ejemplo, si tomamos =y !, funcionará como operadores solo si está en el patrón de !=o !==. Puede haber numerosas combinaciones para estos caracteres como !====, !==!etc. , etc. Las combinaciones de operador deben estar en un formato único , un orden único , combinaciones únicas (todos los caracteres no se combinarán con todos los demás caracteres) y definitivamente, sin ningún espacio entre ellos .

Verifique la lista de operadores a continuación;

ingrese la descripción de la imagen aquí

Alfredo
fuente
2
Caí bajo la misma ilusión de poder usar a <table>.
Chad Harrison
+ casi pensé que era una mesa ... pero en realidad es una imagen
Baba
38

==! no es un operador sino dos:

== y !

! tener una mayor prioridad que ==

Entonces :

"a" !== " ": bool(true) -> verdadero porque "a" realmente no es igual a ""

"a" ==! " ": bool(false) -> falso porque "a" no es igual a ""

Podría escribirse con un espacio entre == y!.

Michael Laffargue
fuente
1
false because "a" is not equals to !" "! "" significa lanzar a bool y negar que "" es verdadero y! "" es falso.
Zaffy
@quarry Sí, no fui demasiado dentro de la explicación: p
Michael Laffargue
29

==!no existe como tal Es una notación algo críptica de== !

Como los espacios no importan en esas operaciones, podría escribir fácilmente a --> b, lo que se evalúa a-- > b, pero se verá extraño.

Entonces, en cuanto a la pregunta: "a" ==! " "se analizará "a" == !" ". Negación de una cadena está cubierta por la fundición , es decir, cualquier cadena, pero "0"y " "es que, cuando fundido, true.

Por lo tanto, la expresión "a" == !" "se transferirá:

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

Y, como string "a"no es lo mismo que bool true, esto evalúa la expresión completa a false.

Entonces, ¿cuál es la moraleja de la historia? ¡No te confundas con espacios faltantes o mal ubicados! :)

FP
fuente
3
a diferencia de lo establecido en esta respuesta, "a" == verdadero se evalúa como verdadero porque una cadena no vacía se convierte en el valor booleano verdadero. La expresión "a" === verdadero se evaluaría como falsa.
Pascal Rosin
25

==! no es un operador

==!no es un operador de comparación de php en absoluto: es lo mismo que == !(tenga en cuenta el espacio)

Es decir

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
fuente