‘Y’ vs ‘&&’ como operador

7 minutos de lectura

Y vs como operador
ts.

Tengo una base de código donde los desarrolladores decidieron usar AND y OR en lugar de && y ||.

Sé que hay una diferencia en la precedencia de los operadores (&& va antes and), pero con el marco dado (PrestaShop para ser precisos) claramente no es una razón.

¿Qué versión está utilizando? Es and más legible que &&? ¿O no hay diferencia?

  • Tenga en cuenta que ~ es el operador NOT bit a bit y no el lógico. 😉

    – Gumbo

    10 de mayo de 2010 a las 14:26

  • Sí, lo sé. Malos hábitos 🙂 . Es un poco extraño que en PHP haya ‘y’, ‘o’ y ‘xor’, pero no hay ‘no’, ¿no?

    – ts.

    12 mayo 2010 a las 10:30

  • @ts: la respuesta correcta aquí es la proporcionada por R. Bemrose stackoverflow.com/questions/2803321/and-vs-as-operator/…

    – Marco Demaio

    24 mayo 2011 a las 15:45

  • ! es el operador lógico no

    – Tormenta de cuchillas

    30 de mayo de 2011 a las 8:15

  • @chiliNUT tiene toda la razón. En ese momento debió tener sentido. Parece que la respuesta incorrecta al acecho ha sido castigada en este punto 🙂

    – doble josh

    28 de marzo de 2014 a las 19:34

1647299529 713 Y vs como operador
Señor del poder

Si utiliza AND y OReventualmente te tropezarás con algo como esto:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

¿Quieres adivinar qué? $truthiness ¿iguales?

Si tú dijiste false… bzzzt, lo siento, mal!

$truthiness arriba tiene el valor true. ¿Por qué? = tiene un mayor precedencia que and. La adición de paréntesis para mostrar el orden implícito aclara esto:

($truthiness = $this_one) and $that

si usaste && en lugar de and en el primer ejemplo de código, funcionaría como se esperaba y sería false.

Como se analiza en los comentarios a continuación, esto también funciona para obtener el valor correcto, ya que los paréntesis tienen mayor precedencia que =:

$truthiness = ($this_one and $that)

  • +1: esto debe hacerse alto y claro en la documentación de PHP, o PHP debe cambiar y dar la misma prioridad a estos operadores o DEPRECATE and or De una vez por todas. Vi demasiadas personas pensando que son exactamente lo mismo y las respuestas aquí son más testimonios.

    – Marco Demaio

    24 de mayo de 2011 a las 15:44

  • En realidad, otros lenguajes (por ejemplo, Perl y Ruby) también tienen estas variantes con la misma distinción de precedencia, por lo que no sería sensato desviarse de este estándar (por más desconcertante que pueda ser para los principiantes) al igualar la precedencia en PHP. Sin mencionar la compatibilidad con versiones anteriores de toneladas de aplicaciones PHP.

    – Mladen Jablanović

    25 de enero de 2012 a las 8:27

  • La incapacidad de las personas para leer la documentación de un idioma no hace que las decisiones del idioma sean incorrectas. Como señala Mladen, Perl y Ruby también utilizan estos operadores adicionales y con las mismas precedencias. Permite construcciones como $foo and bar(), que son buenos atajos para declaraciones if. Si un comportamiento inesperado (por una mala documentación o por no leerla) fuera una razón para no usar algo, no estaríamos hablando de usar PHP en absoluto.

    – Altreo

    30 de agosto de 2012 a las 11:49

  • Pasé 3 minutos para encontrar la línea incorrecta: $esto = verdadero🙁 y qué pasa con $veracidad = ($esto y $eso); se ve mejor para mí 🙂

    – Dmitri Kozmenko

    6 mayo 2013 a las 15:52


  • Estoy de acuerdo con Dmitriy: envolver la evaluación booleana entre paréntesis ayuda a aclarar la intención del código. Creo que el operador y su función tal como existen ahora son valiosos y consistentes con otros lenguajes, es trabajo del programador entender el lenguaje.

    – Jon z

    12 mayo 2013 a las 13:59

Y vs como operador
adamjlev

Dependiendo de cómo se use, puede ser necesario e incluso útil.
http://php.net/manual/en/language.operators.logical.php

// "||" has a greater precedence than "or"

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

Pero en la mayoría de los casos, parece más una cuestión de gusto del desarrollador, como cada ocurrencia de esto que he visto en el marco CodeIgniter como ha mencionado @Sarfraz.

  • Vale la pena señalar que el “verdadero” no se ignora si esa expresión es parte de una declaración más grande. Considere el caso if ($f = false or true) $f = true; – el resultado sería que $f se vuelve verdadero al final, porque la expresión se evalúa como verdadera en general.

    – Chris Browne

    15 de marzo de 2012 a las 22:04

  • no, simplemente sobrescribió la variable más tarde. la expresión aún se evaluó como falsa, luego la sobrescribió con verdadera en la siguiente línea.

    – r3wt

    13 mayo 2014 a las 21:50

  • En realidad, tenía razón. Primero, $f se le asigna falso, pero la condición se evalúa como verdadera, entonces $f se sobrescribe. Si la condición se evalúa como falsa, $f nunca se sobrescribiría de ninguna manera.

    – ahouse101

    29 de junio de 2014 a las 23:58

  • Es ridículo sugerir que los desarrolladores deberían seguir su propio gusto. Olvídese de la pesadilla de otro desarrollador tratando de mantener el mismo código, el desarrollador que escribió el código en sí estaría cometiendo errores semánticos en cualquier código escrito porque él/ella prefería and sobre &&donde and funciona como se esperaba solo en algunas situaciones y && funciona como se esperaba en todas las situaciones.

    – ADTC

    7 sep 2018 a las 19:49

Ya que and tiene menor precedencia que = puedes usarlo en la asignación de condiciones:

if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false

Por seguridad, siempre pongo paréntesis en mis comparaciones y las espacio. De esa manera, no tengo que confiar en la precedencia del operador:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

Y vs como operador
arviman

La precedencia difiere entre && y y (&& tiene mayor precedencia que y), algo que causa confusión cuando se combina con un operador ternario. Por ejemplo,

$predA && $predB ? "foo" : "bar"

devolverá un cuerda mientras que

$predA and $predB ? "foo" : "bar"

devolverá un booleano.

1647299530 24 Y vs como operador
mahmud zalt

Permítanme explicar la diferencia entre “y” – “&&” – “&”.

“&&” y “y” ambos son operaciones lógicas Y y hacen lo mismo, pero la precedencia del operador es diferente.

La precedencia (prioridad) de un operador especifica qué tan “fuertemente” une dos expresiones. Por ejemplo, en la expresión 1 + 5 * 3, la respuesta es 16 y no 18 porque el operador de multiplicación (“*”) tiene mayor precedencia que el operador de suma (“+”).

Mezclarlos en una sola operación podría darte resultados inesperados en algunos casos
Recomiendo usar siempre &&, pero esa es tu elección.


Por otro lado, “&” es un operación AND bit a bit. Se utiliza para la evaluación y manipulación de bits específicos dentro del valor entero.

Ejemplo, si haces (14 y 7), el resultado sería 6.

7   = 0111
14  = 1110
------------
    = 0110 == 6

1647299531 84 Y vs como operador
Salathe

¿Qué versión está utilizando?

Si los estándares de codificación para el código base en particular para el que estoy escribiendo el código especifican qué operador se debe usar, lo haré definitivamente usa eso. Si no, y el código dicta que debe usarse (no a menudo, se puede solucionar fácilmente), entonces lo usaré. De lo contrario, probablemente &&.

¿Es ‘y’ más legible que ‘&&’?

¿Es más legible? para ti. La respuesta es si y no dependiendo de muchos factores, incluido el código alrededor del operador y, de hecho, ¡la persona que lo lee!

|| hay ~ diferencia?

Si. Ver operadores logicos por || y operadores bit a bit por ~.

¿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