Operadores lógicos, / / o O?


Recuerdo haber leído hace un tiempo con respecto a los operadores lógicos que en el caso de OR, usar || era mejor que or (o viceversa).

Tuve que usar esto en mi proyecto cuando volvió a mí, pero no puedo recordar qué operador se recomendó o si era cierto.

¿Qué es mejor y por qué?

Author: John Slegers, 2011-05-14

8 answers

No hay "mejor" pero el más común es ||. Tienen diferentes prioridad y || funcionaría como uno esperaría normalmente.

Véase también: Operadores lógicos (el siguiente ejemplo se toma de allí):

// 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;
 111
Author: Felix Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-13 22:24:37

Se utilizan para diferentes propósitos y, de hecho, tienen diferentes precedentes de operadores. Los operadores && y || están destinados a condiciones booleanas, mientras que and y or están destinados a controlar el flujo.

Por ejemplo, lo siguiente es una condición booleana:

if ($foo == $bar && $baz != $quxx) {

Esto difiere del flujo de control:

doSomething() or die();
 36
Author: Matthew Ratzloff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-13 22:20:32

La diferencia entre respectivamente / / y O y & & y Y es precedencia del operador :

$bool = FALSE || TRUE;

  • interpretado como ($bool = (FALSE || TRUE))
  • el valor de $bool es TRUE

$bool = FALSE OR TRUE;

  • interpretado como (($bool = FALSE) OR TRUE)
  • el valor de $bool es FALSE

$bool = TRUE && FALSE;

  • interpretado como ($bool = (TRUE && FALSE))
  • el valor de $bool es FALSE

$bool = TRUE AND FALSE;

  • interpretado como (($bool = TRUE) AND FALSE)
  • el valor de $bool es TRUE
 14
Author: John Slegers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-18 06:38:05

Fuente : http://bit.ly/1hxDmVR

Aquí hay un código de ejemplo para trabajar con operadores lógicos:

<html>

<head>
<title>Logical</title>
</head>
<body>
<?php
$a=10;
$b=20;
if($a>$b)
{
    echo " A is Greater";
}
elseif($a<$b)
{
    echo " A is lesser";
}
else
{
     echo "A and B are equal";
}
?>
<?php
    $c=30;
    $d=40;
   //if(($a<$c)AND($b<$d))
   if(($a<$c)&&($b<$d))
   {
       echo "A and B are larger";
   }
   if(isset($d))
       $d=100;
   echo $d;
   unset($d);
?>
<?php
    $var1=2;
    switch($var1)
    {
        case 1:echo "var1 is 1";
               break;
        case 2:echo "var1 is 2";
               break;
        case 3:echo "var1 is 3";
               break;
        default:echo "var1 is unknown";
    }
?>
</body>
</html>
 5
Author: improgrammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-07 18:03:55

No creo que uno sea inherentemente mejor que otro, pero sugeriría seguir con || porque es el predeterminado en la mayoría de los idiomas.

EDITAR: Como otros han señalado, de hecho hay una diferencia entre los dos.

 0
Author: exahex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-13 22:46:09

No hay nada malo o mejor, Solo depende de la precedencia de los operadores. Dado que || tiene mayor precedencia que or, se usa principalmente ||.

 0
Author: Nishu Tayal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-06 12:34:43

Sé que es un tema antiguo, pero aún así. Acabo de conocer el problema en el código que estoy depurando en el trabajo y tal vez alguien puede tener un problema similar...

Digamos que el código se ve así:

$positions = $this->positions() || [];

Usted esperaría (como está acostumbrado, por ejemplo, en javascript) que cuando this this->positions() devuelve false o null, positions positions es un array vacío. Pero no lo es. El valor es VERDADERO o FALSO depende de lo que returns this->positions() devuelva.

Si necesita obtener el valor de positions this->positions () o matriz vacía, tienes que usar:

$positions = $this->positions() or [];

EDITAR:

El ejemplo anterior no funciona como se pretendía, pero la verdad es que || y or no es lo mismo... Prueba esto:

<?php

function returnEmpty()
{
  //return "string";
  //return [1];
  return null;
}

$first = returnEmpty() || [];
$second = returnEmpty() or [];
$third = returnEmpty() ?: [];

var_dump($first);
var_dump($second);
var_dump($third);
echo "\n";

Este es el resultado:

bool(false)
NULL
array(0) {
}

Por lo tanto, en realidad la tercera opción ?: es la solución correcta cuando se desea establecer el valor devuelto o matriz vacía.

$positions = $this->positions() ?: [];

Probado con PHP 7.2.1

 0
Author: Zdeněk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-04 19:10:06

Algunos lenguajes usan cortocircuito, otros usan evaluación booleana completa (si sabes, esto es similar a la directiva $B en pascal)

Explicaciones:

function A(){
 ...do somethings..
 return true;
}

function B(){
 ...do somethings..
 return true;
}

if ( A() OR B() ) { .....

En este ejemplo la función B() nunca será ejecutada. Dado que la función A() devuelve TRUE, el resultado de la instrucción OR se conoce desde la primera parte sin que sea necesario evaluar la segunda parte de la expresión.

Sin embargo, con ( A() || B() ), la segunda parte siempre se evalúa independientemente del valor de la primera.

Para la programación optimizada, siempre debe usar OR que es más rápido (excepto en el caso en que la primera parte devuelve false y la segunda parte realmente necesita ser evaluada).

 -3
Author: janhsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-22 13:48:04