Как работают логические операторы среди трех булевых переменных? - PullRequest
0 голосов
/ 15 июня 2019

Я новичок в PHP сейчас и не разбираюсь в программной логике, так что эта эпопея кодов действительно смутила меня.

Окончательные результаты, которые мне возвращают, являются «истинно ложными».На мой взгляд, результат должен быть ложным, потому что «$ b» и «$ c» имеют разные значения, поэтому они не могут удовлетворять условию »и«.

Кроме того, если это «$ a» и «$ b "будет работать в первую очередь как группа, результат" $ a или $ b "должен быть" true ", и это также не равно $ c.

Большое спасибо!

Версия PHP7

<?php
$a = true;
$b = true;
$c = false;

if($a or $b and $c)
echo 'true'." ";
else 
echo 'false';
?>

страница результатов: введите описание изображения здесь

1 Ответ

0 голосов
/ 15 июня 2019

В случае сомнений используйте скобки, чтобы сделать условия явными.Таким образом, код будет легче понять позже.

Порядок условий зависит от приоритета оператора, если он тот же, то слева направо.

Однако PHP фактически оптимизирует условия при их обработке.В случае $c1 or $c2, если $c1 равно true, значение $c2 не имеет значения, поэтому оно не проверяется.Результат может быть только true.То же самое происходит для $c1 and $c2 - если $c1 ложно, результатом общего условия может быть только false.

Так что ($a or $b and $c) - это то же самое, что и ($a or ($b and $c)) для ожидаемого результата, используйте (($a or $b) and $c).

Вот небольшой скрипт, который позволяет вам протестировать его:

// a small function with some debug output
function createConditions(bool ...$values) {
    return function($callIndex) use ($values) {
        echo 'Call #', $callIndex, "\n";
        return $values[$callIndex - 1] ?? false;
    };
}
$c = createConditions(true, true, false);

if ($c(1) or $c(2) and $c(3)) {
    echo "Result: TRUE\n\n";
} else {
    echo "Result: FALSE\n\n";
}

if (($c(1) or $c(2)) and $c(3)) {
    echo "Result: TRUE\n\n";
} else {
    echo "Result: FALSE\n\n";
}

Выход:

Call #1 
Result: TRUE 

Call #1 
Call #3 
Result: FALSE
...