Diferencia entre “!==” y “==!” [closed]

7 minutos de lectura

avatar de usuario
Gerald Schneider

Ayer me topé con esto cuando modifiqué el código PHP escrito por otra persona. Me desconcertó que una simple comparación (if ($var ==! " ")) no funcionó como se esperaba. Después de algunas pruebas, me di cuenta de que quien escribió ese código usó ==! en vez de !== como operador de comparación. nunca he visto ==! en cualquier idioma, así que me preguntaba cómo diablos 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 o cualquier cosa al respecto en cualquier 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?

  • vamos… ¿qué pasa con los votos a favor? Puedo hacer una docena más de preguntas como esta. Y acompañarlos de análisis cuasi serios. Esta es la práctica estándar de ejercicios de libros de texto, no. En SO votamos por la calidad y la información, no por la diversión y el entretenimiento.

    – seje

    7 sep 2012 a las 14:12

  • @sehe Está recibiendo votos a favor porque es la definición de una pregunta bien investigada: ha “buscado minuciosamente una respuesta”, “ha sido específico”, la pregunta es “relevante para otros” y está “sobre 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

    7 sep 2012 a las 15:59

  • @JRaymond: está recibiendo votos a favor porque es una pregunta de trivia para un problema muy fácil de entender y responder. El aspecto de trivia aumenta la curiosidad, lo que atrae a más personas, y el aspecto fácil aumenta el porcentaje de personas que entienden la pregunta y la respuesta lo suficiente como para votarla. No está relacionado con que sea una buena pregunta o no.

    – Tomás Bonini

    7 sep 2012 a las 16:16


  • @JRaymond, admítelo, la mayoría de las preguntas con muchos votos positivos son trivialidades. Eche un vistazo a estas tres preguntas mías entre muchas otras: 1, 2, 3. Ninguna de ellas es algo que pueda encontrar en Google (a diferencia de la mayoría de las preguntas con muchos votos a favor) y están bien pensadas y probadas antes de ser escritas. (Lo sé, porque yo los escribí). Sin embargo, dado que son preguntas que requieren experiencia, nunca obtienen votos altos. Así es como funciona el sistema aquí.

    – Shahbaz

    7 sep 2012 a las 16:54

  • @JRaymond sehe tiene razón. Los escritores tendrían un día de campo en SO. Sugeriría revisar esta lista (php.net/quickref.php) y planteando 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.

    7 sep 2012 a las 23:20


avatar de usuario
explosión dao

La diferencia es que no hay operador. ==!.

Esta expresión:

$a ==! $b

Básicamente es lo mismo que esto:

$a == (!$b)

  • Wow, muchas buenas respuestas en tan poco tiempo. Escogí la primera respuesta que aclaró que el ! se aplica a la variable de la derecha y por lo tanto tiene el mayor valor. Lo siento por los otros chicos 😉

    – Gerald Schneider

    7 de septiembre de 2012 a las 7:26

  • @Gerald Schneider: Lo menos que podía hacer para compensarlo era mejorar esta respuesta para que estuviera al menos a la par con las otras respuestas en términos de gramática y formato (una de las cuales mencionó específicamente por su explicación muy detallada !). Pero no importa, lo he editado ahora.

    – BoltClock

    7 sep 2012 a las 14:28


  • Ni siquiera programo en PHP e incluso me di cuenta de que “==!” se leería como los 2 operadores “==” y “!”. Simplemente muestra cuánto efecto puede tener un poco de diseño en la forma en que lee algo.

    – Nombre de estrella

    7 sep 2012 a las 17:47

  • @Bang Dao Um, ¿JavaScript? Tiene === y !==. Pero no ==!

    – psr

    7 sep 2012 a las 23:02

  • @BangDao Ahora encontraste otra razón para w3tontos Por favor, léalo, es importante.

    – alguno

    8 de septiembre de 2012 a las 9:13

avatar de usuario
Alfredo

No hay ==! operador en PHP

Es solo una combinación de == y !. El único operador relevante presente aquí es ==. Así que la combinación ==! funcionará como un normal ==comprobación Equalityy créeme,

$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)

Es posible que la combinación de varios caracteres de operadores no funcione siempre como un operador. 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 operadores deben estar en formato único, orden único, combinaciones únicas (todos los personajes no se combinarán con todos los demás personajes) y definitivamente, sin ningún espacio entre ellos.

Consulte la lista de operadores a continuación;

ingrese la descripción de la imagen aquí

  • Caí bajo la misma ilusión de poder usar un <table>.

    – Chad Harrison

    7 sep 2012 a las 15:27

  • + casi pensé que era una mesa… pero en realidad es una imagen

    – Babá

    04/04/2013 a las 21:20

avatar de usuario
Michael Laffargue

==! no es un operador sino dos:

== y !

! tener mayor prioridad que ==

Asi que :

"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 !.

  • false because "a" is not equals to !" " !” ” significa lanzar a bool y negar que so ” ” es verdadero y !” ” es falso.

    – Zaffy

    8 de septiembre de 2012 a las 13:07

  • @quarry Sí, no me metí demasiado en la explicación :p

    –Michael Laffargue

    10 de septiembre de 2012 a las 12:41


==! 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 --> bque evalúa a a-- > bpero se verá extraño.

Entonces, en cuanto a la pregunta: "a" ==! " " será analizado para "a" == !" ". La negación de una cadena está cubierta por fundiciónque significa cualquier cadena pero "0" y " " es, cuando se lanza, true.

Así, la expresión "a" == !" " será transferido:

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

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

Entonces, ¿cuál es la moraleja de la historia? ¡No se deje confundir por espacios faltantes o mal colocados! 🙂

avatar de usuario
AD7seis

==! no es un operador

==! no es un operador de comparación de php en absoluto, es lo mismo que == ! (note 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)
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad