Я пытаюсь понять поведение or оператора. Ниже приведены примеры:
$e = false || true; var_dump($e);
Вывод как ожидалось: bool(true);
$f = false or true; var_dump($f);
Вывод выполняется так, как ожидалось: bool(false) . Я понял это таким образом, что = имеет более высокий приоритет, чем Or , так что $f присваивается false .
Но приведенный ниже код работает совершенно противоположно тому, что я думал. Я думал, что $foo будет присвоен 5 а затем сравним с самим собой. Но $foo присваивается только тогда, когда устанавливается $foo что означает, что он проверяет, присваивается ли $foo чему-либо раньше, назначьте ему 5.
$foo or $foo = 5;
Может ли кто-нибудь объяснить, почему это так?
Основы:
Выражение присваивания приводит к присвоенному значению.
Что это значит? $foo = 'bar' – это выражение, в котором оператор присваивания = присваивает значение. Выражение всегда возвращает само значение. Так же, как выражение 1 + 2 приводит к значению 3 , выражение $foo = 'bar' приводит к значению 'bar' . Вот почему это работает:
$foo = $bar = 'baz'; // which is: $foo = ($bar = 'baz');
Булевы операции являются короткозамкнутыми операциями. Обе стороны не всегда оцениваются, если им это не нужно. true || false true || false всегда true целом, так как левый операнд true , поэтому все выражение должно быть true . false здесь даже не оценивается.
Приоритет оператора определяет, в каком порядке части выражения сгруппированы в подвыражения. Операторы с более высоким приоритетом группируются с их операндами перед операторами меньшего приоритета.
Следовательно:
$e = false || true;
false || true вычисляется значение true , которое приводит к значению true , которому присваивается значение $e . || оператор имеет более высокий приоритет, чем = , поэтому false || true false || true сгруппировано в выражение (в отличие от ($e = false) || true ).
$f = false or true;
Здесь сейчас or имеет более низкий приоритет, чем = , что означает, что операция присваивания сгруппирована в одно выражение до or . Итак, сначала оценивается выражение $f = false , результат которого является false (см. Выше). Итак, у вас есть простое выражение false or true которое оценивается далее и приводит к true , но о котором никто не заботится.
Оценка работает следующим образом:
1. $f = false or true; 2. ($f = false) or true; // precedence grouping 3. false or true; // evaluation of left side ($f is now false) 4. true; // result
Теперь:
$foo or $foo = 5;
Здесь опять же $foo = 5 имеет более высокий приоритет и рассматривается как одно выражение. Поскольку это происходит в правой части оператора or , выражение оценивается, если необходимо. Это зависит от того, из чего первоначально $foo . Если $foo true , правая часть не будет оцениваться вообще, так как true or ($foo = 5) должны быть true целом. Если $foo первоначально имеет значение false, правая часть оценивается и 5 присваивается $foo , что приводит к 5 , что истинно-ish, что означает, что общее выражение true , о котором никто не заботится.
1. $foo or $foo = 5; 2. $foo or ($foo = 5); // precedence grouping 3. false or ($foo = 5); // evaluation of left side 4. false or 5; // evaluation of right side ($foo is now 5) 5. true; // result
Согласно веб-странице php.net о логических операторах :
Эта:
$e = false || true;
Действует так:
$e = (false || true) // If false is true, then $e = false. Otherwise true
Эта:
$f = false or true;
Будет действовать следующим образом:
($f = false) or true; // $f = false is true, as the assignment succeeded
Эта:
$foo or $foo = 5;
Будет действовать следующим образом:
$foo or ($foo = 5) // foo = undefined or foo = 5, so foo = 5
Для последнего неопределенное значение в основном равно false, поэтому foo равно 5.
Кроме того, вот ссылка для порядка приоритезации оператора: http://www.php.net/manual/en/language.operators.precedence.php
ОБНОВИТЬ:
Хорошо, теперь давайте перейдем к главному. Как мы все знаем, когда вы используете запрос:
while($row = @mysql_fetch_assoc($result))
И все мы знаем, что петли выполняются только на true , поэтому $row = @mysql_fetch_assoc($result) возвращает true.
То же самое с вопросом Дарья.
$foo or $foo = 5;
В основном:
$foo or ($foo = 5);
Что в основном:
$foo = undefined or ($foo = 5); // $foo = 5 actually returns true
Что также
$foo = undefined or true;
И, как я уже упоминал ранее, undefined = false, поэтому $ foo = 5 (так как это истинный оператор).
Надеюсь, каждый может понять.
$foo or $foo = 5; Suppose let say $foo=true or $foo=5;
здесь он не будет оценивать после или выражение оператора, поэтому выход будет равен $ foo = 1. Теперь выражение
$foo=false or $foo=5;
Здесь он будет оценивать после или как = более высокий приоритет, так что $foo из которого он будет оценивать $foo=5 поэтому выход будет равен 5 Но когда мы оцениваем $foo=false or true здесь он будет считать = более высокий приоритет, поэтому output будет $foo=false но целое выражение будет оцениваться как true, потому что false or true становится false
<?php $foo = false; $foo or ($foo = '5'); echo $foo; ?>
Проверьте это, вы можете присвоить значение «5» для $foo .
Сравните, чем or = имеет высокий приоритет .. Это факт …. 🙂