логический — PHP приоритет операторов

Я прочитал это =
имеет более высокий приоритет, чем 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?

3

Решение

Ты прав, что

$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

8

Другие решения

Я тестировал с 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 состояния:

Причина двух разных вариантов операторов «и» и «или» заключается в том, что они работают с разными приоритетами. (См. Приоритет оператора.)

2

Вы ошибаетесь здесь:

Это возвращает истину, но мой вопрос, почему он возвращает истину,
не должен ли он вернуть ложь?

Ну, это не возвращает истину. Возвращает ложь. Возможно, вы ошиблись результатом (true) and false с содержанием $res который равен ($res = $boolone), Вы не присвоили результат (true) and false в $res,

0
По вопросам рекламы [email protected]