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

Posted

技术标签:

【中文标题】多个布尔条件 - 运算符优先级【英文标题】:Multiple boolean conditions - operator precedence 【发布时间】:2011-12-29 14:39:40 【问题描述】:

我遇到了如下代码行:

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

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

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

【问题讨论】:

php.net/manual/en/language.operators.precedence.php 当然,运算符的顺序是明确定义的,就像在任何体面的编程语言中一样。见this link。 我使用 Nandos 作为助记词:Not, and, or , s最简形式在前。给~,!,&,|,&&,||,AND,OR 【参考方案1】:

&& 取决于当左表达式为真时对右表达式的评估,|| 则不然。您可以将其重写为:

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

它会是一样的。

【讨论】:

【参考方案2】:

在没有括号的情况下,PHP 将使用 PHP 的 operator precedence 从左到右计算每个表达式。然而,就像在任何逻辑检查中一样,将AND 混入其中会使事情变得混乱并且难以阅读。

【讨论】:

【参考方案3】:

除非有优先权,否则它会从左到右开始。

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

您也可以在 javascript sn-p 中看到相同的行为:

var rt = 0;

function rtrue(x) 
  console.log(x, 'called true', ++rt);
  return true;

var rf = 0;

function rfalse(x) 
  console.log(x, 'called false', ++rf);
  return false;


// all but last get called, eq: false || (true && false) || (false && true)
console.log('=== result',
  rfalse('a') || rtrue('b') && rfalse('c') || rfalse('d') && rtrue('e')
);
// first true does not get called, eq: (false && true) || true
console.log('=== result',
  rfalse('x') && rtrue('y') || rtrue('z')
);

【讨论】:

不,这解释了他的问题。语言(在这种情况下)无关紧要。

以上是关于多个布尔条件 - 运算符优先级的主要内容,如果未能解决你的问题,请参考以下文章

运算符优先级

python之常用操作符

python运算符的优先级

Python 运算符优先级 运算符

7. Python运算符之逻辑成员身份运算符及优先级

python学习之运算表达式优先级