Логические операторы, ||или или? - PullRequest
93 голосов
/ 14 мая 2011

Я помню, как читал некоторое время назад в отношении логических операторов, что в случае OR использование || было лучше, чем or (или наоборот).

Мне просто пришлось использовать это в моем проекте, когда он вернулся ко мне, но я не могу вспомнить, какой оператор был рекомендован или был ли он верным.

Что лучше и почему?

Ответы [ 8 ]

127 голосов
/ 14 мая 2011

Нет «лучше», но более распространенным является ||. Они имеют различный приоритет , и || будет работать так, как и следовало ожидать.

См. Также: Логические операторы ( Оттуда взят следующий пример ):

// 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;
40 голосов
/ 14 мая 2011

Они используются для разных целей и на самом деле имеют разные операторские приоритеты.Операторы && и || предназначены для булевых условий, тогда как and и or предназначены для потока управления.

Например, булево условие соответствует следующему:

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

Это отличается от потока управления:

doSomething() or die();
17 голосов
/ 18 января 2016

Разница между соответственно || и ИЛИ и && и И это приоритет оператора :

$bool = FALSE || TRUE;

  • интерпретируется как ($bool = (FALSE || TRUE))
  • значение $bool равно TRUE

$bool = FALSE OR TRUE;

  • интерпретируется как (($bool = FALSE) OR TRUE)
  • значение $bool равно FALSE

$bool = TRUE && FALSE;

  • интерпретируется как ($bool = (TRUE && FALSE))
  • значение $bool равно FALSE

$bool = TRUE AND FALSE;

  • интерпретируется как (($bool = TRUE) AND FALSE)
  • значение $bool равно TRUE
5 голосов
/ 07 мая 2014

Источник: http://bit.ly/1hxDmVR

Вот пример кода для работы с логическими операторами:

<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>
1 голос
/ 13 ноября 2017

Я знаю, что это старая тема, но все же. Я только что столкнулся с проблемой в коде, который я отлаживаю на работе, и, возможно, у кого-то может быть похожая проблема ...

Допустим, код выглядит так:

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

Вы ожидаете (как вы привыкли, например, из javascript), что когда $ this-> позиции () возвращает false или ноль, $ позиции - это пустой массив. Но это не так. Значение TRUE или FALSE зависит от того, что возвращает $ this-> позиции ().

Если вам нужно получить значение $ this-> позиции () или пустой массив, вы должны использовать:

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

EDIT:

Приведенный выше пример не работает, как задумано, но правда в том, что || и or - это не одно и то же ... Попробуйте это:

<?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";

Это результат:

bool(false)
NULL
array(0) {
}

Итак, третий вариант ?: является правильным решением, когда вы хотите установить возвращаемое значение или пустой массив.

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

Протестировано с PHP 7.2.1

0 голосов
/ 05 октября 2014

В некоторых языках используется либо короткое замыкание, в других - полная логическая оценка (если вы знаете, это похоже на директиву $B на паскале)

Пояснения:

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

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

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

В этом примере функция B() никогда не будет выполнена.Так как функция A() возвращает TRUE, результат оператора OR известен из первой части, при этом нет необходимости оценивать вторую часть выражения.

Однако при ( A() || B() ) вторая частьвсегда вычисляется независимо от значения первого.

Для оптимизированного программирования всегда следует использовать OR, что быстрее (за исключением случая, когда первая часть возвращает false, а вторая часть фактически должна бытьоценивается).

0 голосов
/ 29 сентября 2011

Нет ничего плохого или лучшего, это зависит только от приоритета операторов.Поскольку || имеет более высокий приоритет, чем or, поэтому в основном используется ||.

0 голосов
/ 14 мая 2011

Не думаю, что один по своей природе лучше другого, но я бы предложил придерживаться || потому что это значение по умолчанию в большинстве языков.

РЕДАКТИРОВАТЬ: Как уже отмечали другие, между ними действительно есть разница.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...