PHP or
это странное ключевое слово. Здесь он находится в фрагменте кода, который меня смущает:
echo 0 or 1; // prints 1 $foo = (0 or 1); echo $foo; // prints 1 $foo = 0 or 1; echo $foo; // prints 0 for some reason
Почему последний печатает 0, а не 1?
Это связано с разным приоритетом оператора . В третьем случае назначение выполняется первым. Он будет интерпретироваться так:
($foo = 0) or 1;
||
оператор имеет другой приоритет. Если вы используете
$foo = 0 ||1;
Он будет работать так, как вы ожидаете.
См. Руководство по логическим операторам
Нет, я бы не стал, это из-за приоритета оператора :
$foo = 0 or 1; // is same as ($foo = 0) or 1; // because or has lower precedence than = $foo = 0 || 1; // is same as $foo = (0 || 1); // because || has higher precedence than = // where is this useful? here: $result = mysql_query() or die(mysql_error()); // displays error on failed mysql_query. // I don't like it, but it's okay for debugging whilst development.
Это ($foo = 0) or 1;
, or
имеет более низкий приоритет оператора, чем =
.
Вы должны использовать ||
в этом случае, поскольку он имеет более высокий приоритет, чем =
, и, следовательно, будет оцениваться так, как вы ожидали.
IIRC, оператор присваивания ( =
) имеет более высокий приоритет, чем or
. Таким образом, последняя строка будет интерпретироваться как:
($foo = 0) or 1;
Это утверждение, которое присваивает 0 в $foo
, но возвращает 1. Первый оператор интерпретируется как:
echo(0 or 1);
Как таковой будет печатать 1.
Порядок операций. Слово «или» имеет гораздо более низкий приоритет, чем соответствующий «||». Нижний, четный, чем оператор присваивания. Таким образом, назначение происходит сначала, а значение присваивания – это первый операнд к «или».
«или» означает больше для управления потоком, чем для логических операций. Это позволяет вам сказать что-то вроде
$x = get_something() or die("Couldn't do it!");
если get_something закодирован, чтобы вернуть false или 0 при ошибке.
В первых двух фрагментах вы сравниваете 0 или 1 (по существу, true или false). В третьем фрагменте вы назначаете 0, который работает и, следовательно, имеет значение true, поэтому условие или не выполняется. подчеркнутый текст
В третьем примере оператор = имеет более высокий приоритет, чем или, и, таким образом, делается первым. || оператор, внешне одинаковый, имеет более высокий приоритет, чем =. Как вы говорите, интересно.