Pregunta Operadores lógicos, || ¿o o?


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

Solo tuve que usar esto en mi proyecto cuando me llegó, pero no recuerdo qué operador fue recomendado o si era cierto.

¿Cuál es mejor y por qué?


73
2018-05-13 22:15


origen


Respuestas:


No hay "mejor", pero el más común es ||. Ellos tienen diferente precedencia y || funcionaría como uno esperaría normalmente.

Ver también: Operadores logicos (el siguiente ejemplo es tomado 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;

109
2018-05-13 22:17



Se usan para diferentes propósitos y, de hecho, tienen diferentes precedencias de operador. los && y || los operadores están destinados a condiciones booleanas, mientras que and y or están destinados para el flujo de control.

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

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

Esto difiere del flujo de control:

doSomething() or die();

36
2018-05-13 22:20



La diferencia entre respectivamente || y O y && y AND es precedencia del operador :

$bool = FALSE || TRUE;

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

$bool = FALSE OR TRUE;

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

$bool = TRUE && FALSE;

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

$bool = TRUE AND FALSE;

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

13
2018-01-18 06:38



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

Aquí hay un código de muestra 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
2018-05-07 18:03



No creo que uno sea intrínsecamente mejor que otro, pero sugiero 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
2018-05-13 22:17



No hay nada malo o mejor, solo depende de la precedencia de los operadores. Ya que || tiene mayor prioridad que or, asi que || se usa principalmente.


0
2017-09-29 17:13



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

Digamos que el código se ve así:

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

Usted esperaría (como está acostumbrado de, por ejemplo, javascript) que cuando $ this-> positions () devuelve falso o nulo, $ positions es una matriz vacía. Pero no lo es. El valor es VERDADERO o FALSO depende de lo que devuelva $ this-> positions ().

Si necesita obtener un valor de $ this-> positions () o una matriz vacía, debe 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) {
}

Entonces, en realidad la tercera opción ?: es la solución correcta cuando desea establecer un valor devuelto o una matriz vacía.

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

Probado con PHP 7.2.1


0
2017-11-13 13:37



Algunos idiomas usan cortocircuitos, otros usan una evaluación booleana completa (si lo saben, 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á ejecutado. Desde 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 una programación optimizada, siempre debe usar OR que es más rápido (excepto en el caso de que regrese la primera parte) false y la segunda parte realmente necesita ser evaluada).


-3