Я прочитал это =
имеет более высокий приоритет, чем and
Допустим, вы получили
$boolone = true;
$booltwo= false;
$res = $boolone and $booltwo;
Я предположил, что это станет ложным, так как $res = true and false
где истина и ложь равны ложь. Но с тех пор =
имеет более высокий приоритет, он должен стать правдой. Который как это
($res = $boolone) and $booltwo;
Это возвращает истину, но мой вопрос — почему он возвращает истину, не должен ли он вернуть ложь? поскольку $res = $boolone
равняется true
а также $booltwo
по умолчанию имеет значение false, поэтому мы имеем это: true and false
который обычно должен возвращать false, но опять же, почему true?
Просто сказал:
($res = $boolone) and $booltwo;
(true) and false; //returns true?
Ты прав, что
$res = $boolone and $booltwo;
эквивалентно
($res = $boolone) and $booltwo;
Из-за приоритета оператора,
$res = $boolone
оценивается первым, со значением $boolone
быть назначенным на $res
….
$booltwo
затем and
с первым результатом оценки (true and false
), но вы ничего не делаете с этой оценкой, поэтому она просто отбрасывается … она не присваивается $res
потому что это назначение уже было выполнено при первой оценке.
Если вы делаете
var_dump($res = $boolone and $booltwo);
тогда вы увидите результат полной оценки, которая отбрасывается, и $res
все еще true
Я тестировал с PHP 5.6.30, но я не получил результаты, которые предлагают =
крепче, чем &&
,
<?php
$boolone = true;
$booltwo = false;
var_dump($res = ($boolone && $booltwo));
var_dump($res);
var_dump($res = $boolone && $booltwo);
var_dump($res);
var_dump(($res = $boolone) && $booltwo);
var_dump($res);
Выход:
bool(false) // $res = ($boolone && $booltwo) ... $res = (true && false)
bool(false) // $res after assignment is false
bool(false) // $res = $boolone && $booltwo ... $res = true && false
bool(false) // $res after assignment is false
bool(false) // ($res = $boolone) && $booltwo ... ($res = true) && false
bool(true) // $res after assignment is true
Выводы:
присваивание не крепче &&
по умолчанию. Вы должны использовать парены, чтобы переопределить его.
Обновление: как @Piyin указывает в комментарии, &&
это не то же самое, что and
в PHP. Страница https://secure.php.net/manual/en/language.operators.precedence.php показывает, что они попадают в два разных места в иерархии приоритетов операторов.
https://secure.php.net/manual/en/language.operators.logical.php состояния:
Причина двух разных вариантов операторов «и» и «или» заключается в том, что они работают с разными приоритетами. (См. Приоритет оператора.)
Вы ошибаетесь здесь:
Это возвращает истину, но мой вопрос, почему он возвращает истину,
не должен ли он вернуть ложь?
Ну, это не возвращает истину. Возвращает ложь. Возможно, вы ошиблись результатом (true) and false
с содержанием $res
который равен ($res = $boolone)
, Вы не присвоили результат (true) and false
в $res
,