328

我有一个代码库,开发人员决定使用ANDandOR而不是&&and ||

我知道运营商的优先级存在差异(&&在之前and),但是对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。

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

4

10 回答 10

702

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

$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)
于 2010-05-10T14:48:40.900 回答
46

根据它的使用方式,它可能是必要的,甚至是方便的。 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 提到的那样。

于 2010-05-10T14:27:11.057 回答
14

由于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
于 2016-01-08T07:58:26.413 回答
13

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

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )
于 2012-11-13T14:06:41.083 回答
12

&&and之间的优先级不同(&& 的优先级高于 and),当与三元运算符结合使用时会导致混淆。例如,

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

将返回一个字符串,而

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

将返回一个布尔值

于 2012-08-08T08:59:05.740 回答
2

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

"&&" 和 "and" 都是逻辑与运算,它们做同样的事情,但运算符的优先级不同。

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

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


另一方面,“&”是按位与运算。它用于评估和操作整数值中的特定位。

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

7   = 0111
14  = 1110
------------
    = 0110 == 6
于 2017-11-22T23:37:28.283 回答
1

你用的是哪个版本?

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

'and' 比 '&&' 更易读吗?

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

|| 有~区别?

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

于 2010-05-10T14:52:53.080 回答
1

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

于 2018-07-19T12:51:01.417 回答
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是赋值运算符优先于任何逻辑运算符,正如其他答案中已经很好解释的那样。

于 2010-05-10T14:32:57.610 回答
0

这是一个反例:

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

输出:

bool(false)

我想说这种拼写错误更容易导致隐蔽的问题(与=vs的方式大致相同==),并且比adn/ro错误标记为语法错误的可能性要小得多。我还发现和/或更容易阅读。FWIW,大多数表达偏好的 PHP 框架(大多数不)指定和/或。我也从来没有遇到过一个真实的、非人为的案例,这很重要。

于 2017-06-25T21:00:01.723 回答