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

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

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


当前回答

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

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

其他回答

另一个使用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。

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

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

你用的是哪个版本?

如果我正在为之编写代码的特定代码库的编码标准指定了应该使用哪个操作符,那么我肯定会使用它。如果不是,并且代码规定了应该使用哪个(不经常使用,可以很容易地解决),那么我将使用它。否则,可能是&&。

“and”比“&&”更易读吗?

你是否更容易理解。答案是肯定的,也不是,这取决于很多因素,包括操作符周围的代码,以及阅读它的人!

||有~差别吗?

是的。请参阅||的逻辑运算符和~的位运算符。

我想这是一个品味问题,尽管(错误地)把它们混在一起可能会导致一些不受欢迎的行为:

true && false || false; // returns false

true and false || false; // returns true

因此,使用&&和||更安全,因为它们具有最高优先级。在可读性方面,我想说这些操作符是足够通用的。

更新:关于评论说,这两个操作返回false…好吧,事实上上面的代码没有返回任何东西,我很抱歉歧义。澄清一下:第二种情况下的行为取决于如何使用操作的结果。观察一下这里操作符的优先级是如何发挥作用的:

var_dump(true and false || false); // bool(false)

$a = true and false || false; var_dump($a); // bool(true)

$a === true的原因是因为赋值操作符优先于任何逻辑操作符,这在其他回答中已经很好地解释了。

这里有一个小反例:

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

输出:

bool(false)

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