'AND'vs'&&'作为运算符


297

我有一个代码库,开发人员决定使用ANDand OR代替&&and ||

我知道运算符的优先级(&&之前and)有所不同,但是使用给定的框架(准确地说是PrestaShop),这显然不是原因。

您正在使用哪个版本?是and不是更具有可读性&&?还是没有区别?


1
请注意,这~是按位NOT运算符,而不是逻辑运算符。;-)
Gumbo 2010年

2
是的我知道。陋习 :) 。有点奇怪的是,PHP中有“和”,“或”和“ xor”,但是没有“不”,不是吗?
ts。

1
@ts:这里的正确答案是R. Bemrose提供的一个stackoverflow.com/questions/2803321/and-vs-as-operator/...
马可Demaio

4
!是合乎逻辑的非运算符
剃刀风暴

2
@chiliNUT非常正确。当时一定是有道理的。似乎潜伏的错误答案在这一点上已经受到惩罚:)
doublejosh 2014年

Answers:


662

如果使用ANDOR,最终将被如下所示绊倒:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

想猜得出什么$truthiness相等吗?

如果您说false... bzzzt,对不起,错!

$truthiness以上具有价值true。为什么? =具有比更高的优先级and。添加括号以显示隐式顺序可以使这一点更加清楚:

($truthiness = $this_one) and $that

如果您使用&&而不是and第一个代码示例中的示例,它将可以按预期方式运行,并且为false

如以下评论中所述,这也可以获取正确的值,因为括号的优先级高于=

$truthiness = ($this_one and $that)

134
+1:这应该在PHP文档中清晰明了,或者PHP应该更改并赋予这些运算符相同的优先级,或者and or一次完全DEPRECATE 。我看到太多的人以为他们是完全一样的东西,这里的答案是更多的推荐。
Marco Demaio

11
实际上,其他语言(例如Perl和Ruby)也具有这些具有相同优先级区别的变体,因此通过在PHP中使优先级相等来偏离此标准(无论对于初学者而言是否令人困惑)都是不明智的。更不用说大量PHP应用程序的向后兼容性。
MladenJablanović2012年

23
人们无法阅读某种语言的文档并不意味着该语言的决定是错误的。正如Mladen指出的那样,Perl和Ruby也使用这些额外的运算符,并且具有相同的优先级。它允许使用诸如这样的构造$foo and bar(),它们是if语句的不错的捷径。如果意外的行为(来自错误的文档,或者没有阅读)是不使用某些东西的原因,我们根本不会在谈论使用PHP。
Altreus 2012年

2
我花了3分钟找到错误的行:$ this = true,:(以及$ truthiness =($ this和$ that);对我来说看起来更好:)
Dmitriy Kozmenko 2013年

6
我同意Dmitriy的观点-将布尔值评估括在括号内有助于阐明代码的意图。我认为运算符及其所存在的功能是有价值的,并且与其他语言保持一致,理解语言是程序员的工作。
Jon z

43

根据其使用方式,它可能是必要的,甚至是方便的。 http://php.net/manual/zh/language.operators.logical.php

// "||" has a greater precedence than "or"

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;

但是在大多数情况下,这似乎更像是开发人员的品味,就像我在@Sarfraz这样的CodeIgniter框架中看到的每一次出现都提到过。


2
值得注意的是,如果该表达式是较大语句的一部分,则不会忽略“ true”。考虑这种情况if ($f = false or true) $f = true;-结果最终将$f成为真,因为该表达式的整体评价为真。
克里斯·布朗

1
不,您只是稍后重写变量。该表达式仍然计算为false,然后在下一行用true覆盖它。
r3wt

2
实际上,他是对的。首先,$f将其分配为false-但条件的计算结果为true,因此将$f其覆盖。如果条件评估为假,$f则将永远不会被任何一种方式覆盖。
ahouse101 2014年

建议开发人员遵循自己的口味是荒谬的。不用担心另一个试图维护相同代码的开发人员的噩梦,编写代码本身的开发人员将在任何编写的代码中出现语义错误,因为s /他优先and&&,在and某些情况下&&按预期工作,而在所有情况下按预期工作情况。
ADTC

13

为了安全起见,我总是在比较中加上括号并隔开。这样,我不必依靠运算符的优先级:

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

29
就我个人而言,我认为添加多余的不必要的括号会使阅读变得比仅仅拥有所需的内容更加令人困惑。例如,我认为这更容易阅读:if(($ i == 0 && $ b == 2)||($ c == 3 && $ f!= 5))
rooby,2014年

4
我认为这是我整天看过的最漂亮的代码。做得好。
rm-vanda 2014年

由于PHP是一种解释型语言,因此如果您在代码中不使用不必要的空格或换行符,它将可以快速运行。如果您对编译语言执行相同操作,则只会花费更多时间进行编译,而不会在运行时生效。我并不是说只做一次会产生明显的区别,但是在整个使用php + javascript的应用程序中,两者的编写都像示例一样……加载时间肯定会更长。说明:空格和换行被忽略,但是要忽略它们,必须对其进行检查。这在运行时在解释的lang上以及在编译的lang上进行编译时发生。
JoelBonetR

@JoelBonetR,如果您使用的是php opcache或类似的缓存,则无需担心加载时间。我希望没有人在没有它的情况下运行生产php网站...
PeloNZ 18/09/18

@PeloNZ,所以您可以写脏内容,因为无论如何它都会被缓存,刷新时整个项目只需再加载一秒钟,是吗?编写代码干净对您自己和您的团队成员都是如此,对于时间安排的关注只是大多数人忽略或根本不知道的一点。
JoelBonetR

11

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

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

将返回一个字符串,

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

将返回一个布尔值


10

由于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

2

让我解释一下“和”-“ &&”-“&”之间的区别。

“ &&”和“ and”都是逻辑 “与” 运算,它们执行相同的操作,但是运算符的优先级不同。

运算符的优先级(优先级)指定它如何“紧密”地将两个表达式绑定在一起。例如,在表达式1 + 5 * 3中,答案是16,而不是18,因为乘法(“ *”)运算符的优先级高于加法(“ +”)运算符。

在单个操作中,将它们混合在一起可能会给您带来意想不到的结果,在某些情况下, 我建议始终使用&&,但这是您的选择。


另一方面,“&”是按位AND运算。它用于评估和处理整数值内的特定位。

例如,如果您执行(14&7),结果将为6。

7   = 0111
14  = 1110
------------
    = 0110 == 6

1

您正在使用哪个版本?

如果我要编写的特定代码库的编码标准指定应使用哪个运算符,那么我一定使用它。如果没有,并且代码指示应该使用哪个(不经常使用,可以很容易地解决),那么我将使用它。否则,可能 &&

“和”比“ &&”更具可读性吗?

它对更具可读性。答案是否定的取决于许多因素,包括操作员周围的代码以及阅读它的人员!

|| 有〜区别吗?

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


0

我猜这是一个口味问题,尽管(错误地)将它们混合可能会导致一些不良行为:

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是因为赋值运算符的优先级高于任何逻辑运算符,正如其他答案中已经很好解释的那样。


16
这不是真的,它们都返回false。
杰伊,

0

这是一个小反例:

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

输出:

bool(false)

我想说这种错别字很可能引起隐患(=与vs 大致相同==),比adn/ ro错别字(被标记为语法错误)的可能性要小得多。我也发现和/或更容易阅读。FWIW,大多数表示偏好的PHP框架(大多数没有)指定和/或。我也从来没有遇到过真正重要的情况。


0

另一个很好的例子,它使用if没有=赋值操作的语句。

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

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

因为AND优先级较低,因此||优先级较高。

这是在的情况下,不同的true, false, falsetrue, true, false。有关详细示例,请参见https://ideone.com/lsqovs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.