'AND'vs'&&'作为运营商

时间:2010-05-10 14:20:14

标签: php coding-style operators

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

我知道运营商的优先级有所不同(&&and之前),但对于给定的框架(PrestaShop来说是准确的),这显然不是理由

您使用的是哪个版本? and&&更具可读性吗?或者没有区别?

11 个答案:

答案 0 :(得分:619)

如果你使用ANDOR,你最终会被这样的事情绊倒:

$this_one = true;
$that = false;

$truthiness = $this_one and $that;

想猜出$truthiness等于什么?

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

上面的

$truthiness的值为true。为什么? =的{​​{3}}比and($truthiness = $this_one) and $that 。添加括号以显示隐式顺序使得更清楚:

&&

如果您在第一个代码示例中使用and而不是false,那么它将按预期工作,并且为=

正如下面的评论中所讨论的,这也可以获得正确的值,因为括号的优先级高于$truthiness = ($this_one and $that)

{{1}}

答案 1 :(得分:40)

取决于它的使用方式,它可能是必要的,甚至是方便的。 http://php.net/manual/en/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;

但在大多数情况下,它似乎更像是一个开发人员喜欢的东西,就像我在CodeIgniter框架中看到的每次出现的那样,如@Sarfraz所提到的。

答案 2 :(得分:10)

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

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

答案 3 :(得分:9)

&& 之间的优先级不同(&&优先于&),这会在与三元运算符结合时造成混淆。例如,

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

将返回字符串,而

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

将返回布尔

答案 4 :(得分:8)

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

答案 5 :(得分:1)

  

您使用的是哪个版本?

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

  

'和'比'&&'更具可读性?

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

  

||有差异吗?

是。有关||的{​​{3}}和~的{​​{3}}。

答案 6 :(得分:1)

  

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

"&安培;&安培;"和"和"两者都是逻辑AND操作,它们做同样的事情,但运算符优先级不同。

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

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

另一方面"&"是按位AND操作。它用于评估和处理整数值中的特定位。

如果你这样做(14& 7),结果将是6。

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

答案 7 :(得分:0)

我想这是一个品味问题,虽然(错误地)将它们混合可能会导致一些不良行为:

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

true and false || false; // returns true

因此,使用&&和||因为他们拥有最高优先权,所以更安全。关于可读性,我会说这些运算符足够通用。

UPDATE :关于评论说这两个操作都返回false ...好吧,实际上上面的代码没有返回任何内容,我很抱歉这种模糊性。澄清:第二种情况中的行为取决于如何使用操作的结果。观察运算符的优先级如何发挥作用:

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

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

$a === true之所以是因为赋值运算符优先于任何逻辑运算符,正如在其他答案中已经很好地解释的那样。

答案 8 :(得分:0)

这是一个小小的反例:

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

输出:

bool(false)

我认为这种拼写错误更有可能导致潜在的问题(与= vs ==的方式大致相同),并且注意力远远低于{{1错误标记为语法错误的/ / adn错别字。我也发现和/或更容易阅读。 FWIW,表示偏好的大多数PHP框架(大多数没有)指定和/或。我也从未遇到过一个真实的,非人为的情况,它会很重要。

答案 9 :(得分:0)

  

根据您使用的语言,通常最好使用&&||而不是andor,但Python等语言除外改为使用andor,而&&||不存在。

答案 10 :(得分: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