php - trabajo - ''Y'' vs ''&&'' como operador
ternary operator php (11)
¿Qué versión está utilizando?
Si los estándares de codificación para el código base en particular, estoy escribiendo un código para especificar qué operador se debe usar, definitivamente lo usaré. Si no, y el código dicta qué se debe usar (no a menudo, se puede solucionar fácilmente), entonces usaré eso. De lo contrario, probablemente &&
.
¿Es ''y'' más legible que ''&&''?
¿Es más legible para usted ? La respuesta es sí y no dependiendo de muchos factores, incluido el código que rodea al operador y, de hecho, a la persona que lo está leyendo.
|| hay ~ diferencia?
Sí. Ver operadores lógicos para ||
y operadores bitwise para ~
.
Tengo una base de código donde los desarrolladores decidieron usar AND
y OR
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?
Dependiendo del idioma que esté utilizando, generalmente es una mejor práctica usar
&&
y||
en lugar deand
yor
, excepto en lenguajes como Python, dondeand
yor
se usan en lugar de y&&
y||
no existe.
Permítanme explicar la diferencia entre "y" - "&&" - "&".
"&&" y "and" son operaciones lógicas AND y hacen lo mismo, pero la prioridad del operador es diferente.
La prioridad (prioridad) de un operador especifica cómo "estrechamente" 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 una prioridad más alta que el operador de suma ("+").
Combinándolos en una sola operación, podría dar resultados inesperados en algunos casos , recomiendo usar siempre &&, pero esa es su elección.
Por otro lado, "&" es una operación AND a nivel de bits . 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
Aquí hay un pequeño ejemplo de contador:
$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);
salida:
bool(false)
Yo diría que este tipo de error tipográfico es mucho más probable que cause problemas insidiosos (de la misma manera que =
vs ==
) y es mucho menos probable que se note que los errores tipográficos adn
/ ro
que se marcarán como errores de sintaxis. También encuentro y / o es mucho más fácil de leer. FWIW, la mayoría de los marcos de trabajo de PHP que expresan una preferencia (la mayoría no) especifica y / o. Tampoco me he encontrado con un caso real, no ideado, en el que hubiera importado.
Dependiendo de cómo se use, podría ser necesario e incluso práctico. 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 bien una cuestión de gusto de los desarrolladores, como cada vez que ocurre esto que he visto en el marco de CodeIgniter como @Sarfraz ha mencionado.
Desde and
tiene una prioridad menor que =
puede usarlo en la asignación de condición:
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
La precedencia difiere entre && y y (&& tiene una precedencia mayor que y), algo que causa confusión cuando se combina con un operador ternario. Por ejemplo,
$predA && $predB ? "foo" : "bar"
devolverá una cadena mientras
$predA and $predB ? "foo" : "bar"
devolverá un booleano .
Otro buen ejemplo usando sentencias if
sin operaciones de asignación.
if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE
y
if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE
porque AND
tiene una prioridad menor y por lo tanto ||
una precedencia más alta.
Estos son diferentes en los casos de true, false, false
y true, true, false
. Consulte https://ideone.com/lsqovs para ver un ejemplo detallado.
Por seguridad, siempre paréntesis mis comparaciones y las espacio. De esa manera, no tengo que depender de la precedencia del operador:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
Si usa AND
y OR
, eventualmente se verá afectado por algo como esto:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
¿Quieres adivinar qué $truthiness
equivale?
Si dijiste false
... bzzzt, lo siento, mal!
$truthiness
true
arriba tiene el valor true
. ¿Por qué? =
tiene una precedencia mayor que and
. La adición de paréntesis para mostrar el orden implícito lo hace más claro:
($truthiness = $this_one) and $that
Si usó &&
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 una prioridad más alta que =
:
$truthiness = ($this_one and $that)
Supongo que es una cuestión de gusto, aunque (equivocadamente) mezclarlos podría causar algunos comportamientos no deseados:
true && false || false; // returns false
true and false || false; // returns true
Por lo tanto, usando && y || Es más seguro porque tienen la más alta prioridad. En lo que respecta a la legibilidad, diría que estos operadores son lo suficientemente universales.
ACTUALIZACIÓN : Acerca de los comentarios que dicen que ambas operaciones devuelven falso ... bueno, de hecho, el código anterior no devuelve nada, lamento la ambigüedad. Para aclarar: el comportamiento en el segundo caso depende de cómo se utiliza el resultado de la operación. Observe cómo la precedencia de los operadores entra en juego aquí:
var_dump(true and false || false); // bool(false)
$a = true and false || false; var_dump($a); // bool(true)
La razón por la que $a === true
es porque el operador de asignación tiene prioridad sobre cualquier operador lógico, como ya se explicó muy bien en otras respuestas.