我遇到了如下代码行:
if ($users == 'all' || $_POST['user'] == 1 && $users == 'admins' || $_POST[ 'user' ] == 0 && $users == 'mods') ...
我不知道如何满足所有这些条件,因为它们之间没有括号:(
||
比&&
更重要吗?首先评估哪些部分?
当然,就像在任何体面的编程语言中一样,运算符的顺序也已明确定义。
请参见this link。
&&
取决于右表达式的求值,||
则不然。您可以将其重写为:
if(
$users == 'all' ||
($_POST['user'] == 1 && $users == 'admins') ||
($_POST[ 'user' ] == 0 && $users == 'mods')
)
而且会一样。
[不带括号,PHP将始终使用PHP的operator precedence从左到右评估每个表达式。但是,就像在任何逻辑检查中一样,将AND
放入混合中会使事情变得混乱,并且很难阅读。
除非优先级高,否则它从左到右开始。看看这个片段:
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()
);