运算符优先级:带有 && 和 || 的多个表达式

问题描述 投票:0回答:3

我遇到了这样的代码行:

if ($users == 'all' || $_POST['user'] == 1 && $users == 'admins' || $_POST[ 'user' ] == 0 && $users == 'mods') ...

我不明白所有这些条件是如何满足的,因为它们之间没有括号:(

||
&&
更重要吗?首先评估哪些部分?

php if-statement conditional-statements operator-precedence
3个回答
12
投票

&&
取决于左表达式为真时右表达式的求值,
||
则不然。你可以将其重写为:

if(
    $users == 'all' ||
    ($_POST['user'] == 1 && $users == 'admins') ||
    ($_POST['user'] == 0 && $users == 'mods')
)

而且会是一样的。


1
投票

如果没有括号,PHP 将从左到右计算每个表达式,并一路使用 PHP 的 运算符优先级 。然而,就像在任何逻辑检查中一样,将

AND
混入其中可能会使事情变得混乱并且更难以阅读。


1
投票

它从左到右开始,除非优先级占据。

function rtrue($x) {
    static $rt = 0;
    echo $x . ' called true ' . ++$rt . '<br>';
    return true;
}

function rfalse($x) {
    static $rf = 0;
    echo $x . ' called false ' . ++$rf . '<br>';
    return false;
}

// all but last get called, eq: false || (true && false) || (false && true)
$result1 = rfalse('a') || rtrue('b') && rfalse('c') || rfalse('d') && rtrue('e');
echo '=== result '. ( $result1 ? 'true' : 'false' ) . '<br>';

// first true does not get called, eq: (false && true) || true
$result2 = rfalse('x') && rtrue('y') || rtrue('z');
echo '=== result '. ( $result2 ? 'true' : 'false' ) . '<br>';

打印以下内容:

a called false 1
b called true 1
c called false 2
d called false 3
=== result false
x called false 4
z called true 2
=== result true
© www.soinside.com 2019 - 2024. All rights reserved.