Я прочитал это = имеет более высокий приоритет, чем and

Допустим, вы получили

$boolone = true;
$booltwo= false;
$res = $boolone and $booltwo;

Я догадывался, что это станет ложным, поскольку $res = true and false, где true и false равны false. Но поскольку = имеет более высокий приоритет, он должен стать истинным. Который как это

($res = $boolone) and $booltwo;

Это возвращает true, но мой вопрос - почему он возвращает true, не должен ли он возвращать false? Поскольку $res = $boolone равно true и $booltwo по умолчанию ложно, мы имеем следующее: true and false, которое обычно должно возвращать ложь, но опять же, почему истина?

Просто сказал:

($res = $boolone) and $booltwo;
(true) and false; //returns true?
3
KoyaCho 21 Окт 2017 в 00:09

3 ответа

Лучший ответ

Ты прав, что

$res = $boolone and $booltwo;

Эквивалентно

($res = $boolone) and $booltwo;

Из-за приоритета оператора,

$res = $boolone

Оценивается первым, при этом значение $boolone присваивается $res ....

$booltwo затем and редактируется с результатом этого первого результата оценки (true and false), но вы ничего не делаете с этой оценкой, поэтому она просто отбрасывается ... это не ' t присвоено $res, потому что это назначение уже было выполнено при первой оценке.

Если вы делаете

var_dump($res = $boolone and $booltwo);

Тогда вы увидите результат полной оценки, который отбрасывается, и $res по-прежнему true

8
Mark Baker 20 Окт 2017 в 21:18

Я тестировал с 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. operator.logical.php сообщает:

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

2
Bill Karwin 20 Окт 2017 в 22:10

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

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

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

0
Grzegorz Adam Kowalski 20 Окт 2017 в 21:27