我有一个代码库,开发人员决定使用AND和OR,而不是&&和||。

我知道运算符的优先级是不同的(&&在和之前),但对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。

你用的是哪个版本?and比&&更易读?还是没有区别?


当前回答

这里有一个小反例:

$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);

输出:

bool(false)

我想说的是,这种打字错误更有可能导致潜在的问题(与= vs ==相同),而且比adn/ro打字错误更不容易被注意到,后者会被标记为语法错误。我还发现and/or更容易阅读。总之,大多数PHP框架表达了首选项(大多数没有)指定and/or。我也从来没有遇到过一个真实的、不做作的情况,在这种情况下它会很重要。

其他回答

为了安全起见,我总是用圆括号括起来,并将它们分隔开。这样,我就不必依赖运算符优先级:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )

如果你使用AND和OR,你最终会被这样的东西绊倒:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

想猜猜$truthiness等于什么吗?

如果你说错…对不起,错了!

上面的$truthiness值为true。为什么?=的优先级高于and。添加括号来显示隐式顺序,使其更清晰:

($truthiness = $this_one) and $that

如果在第一个代码示例中使用&&而不是and,那么它将像预期的那样工作,结果为false。

正如下面评论中讨论的那样,这也可以获得正确的值,因为括号的优先级高于=:

$truthiness = ($this_one and $that)

另一个使用if语句不带=赋值操作的好例子。

if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE

and

if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE

因为AND的优先级较低,所以||的优先级较高。

这些在真假假和真假的情况下是不同的。 详细示例见https://ideone.com/lsqovs。

因为and的优先级比=低,你可以在条件赋值中使用它:

if ($var = true && false) // Compare true with false and assign to $var
if ($var = true and false) // Assign true to $var and compare $var to false

&&和和之间的优先级不同(&&的优先级高于and),这在与三元运算符组合时会引起混淆。例如,

$predA && $predB ? "foo" : "bar"

将返回一个字符串,而

$predA and $predB ? "foo" : "bar"

将返回布尔值。