多个布尔条件 - 运算符优先级

时间:2011-11-15 14:55:17

标签: php if-statement conditional

我遇到了一个如下所示的代码行:

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

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

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

4 个答案:

答案 0 :(得分:8)

当然,运算符的顺序也很明确,就像任何体面的编程语言一样。

请参阅this link

答案 1 :(得分:8)

&&取决于对正确表达式的评估,||没有。您可以将其重写为:

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

它会是一样的。

答案 2 :(得分:1)

没有括号,PHP将从左到右评估每个表达式,沿途使用PHP的operator precedence。但是,正如在任何逻辑检查中一样,将AND投入混合可能会使事情变得混乱并且更难以阅读。

答案 3 :(得分:0)

除非优先级高,否则它从左到右开始。看看这个片段:

var rt = 0;
function rtrue(){ 
    console.log( 'called true', ++rt );
    return true; 
}
var rf = 0;
function rfalse(){ 
    console.log( 'called false', ++rf );
    return false; 
}

// all but last get called, eq: false || (true && false) || (false && true)
console.log( '=== result',
    rfalse() || rtrue() && rfalse() || rfalse() && rtrue()
);
// second true does not get called, eq: (false && true) || true
console.log( '=== result',
    rfalse() && rtrue() || rtrue()
);