我有一个代码库,开发人员决定使用AND
andOR
而不是&&
and ||
。
我知道运营商的优先级存在差异(&&
在之前and
),但是对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。
您使用的是哪个版本?比更具and
可读性?&&
还是没有区别?
我有一个代码库,开发人员决定使用AND
andOR
而不是&&
and ||
。
我知道运营商的优先级存在差异(&&
在之前and
),但是对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。
您使用的是哪个版本?比更具and
可读性?&&
还是没有区别?
如果你使用AND
and 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)
根据它的使用方式,它可能是必要的,甚至是方便的。 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 提到的那样。
由于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
为了安全起见,我总是把我的比较加上括号并将它们隔开。这样,我不必依赖运算符优先级:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
&&和and之间的优先级不同(&& 的优先级高于 and),当与三元运算符结合使用时会导致混淆。例如,
$predA && $predB ? "foo" : "bar"
将返回一个字符串,而
$predA and $predB ? "foo" : "bar"
将返回一个布尔值。
让我解释一下“and” - “&&” - “&”之间的区别。
"&&" 和 "and" 都是逻辑与运算,它们做同样的事情,但运算符的优先级不同。
运算符的优先级(priority)指定了它将两个表达式“紧密”绑定在一起的程度。例如,在表达式 1 + 5 * 3 中,答案是 16 而不是 18,因为乘法 ("*") 运算符的优先级高于加法 ("+") 运算符。
在单个操作中将它们混合在一起,在某些情况下可能会给您带来意想不到的结果, 我建议您始终使用 &&,但这是您的选择。
另一方面,“&”是按位与运算。它用于评估和操作整数值中的特定位。
例如,如果您执行 (14 & 7),结果将是 6。
7 = 0111
14 = 1110
------------
= 0110 == 6
另一个使用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, false
的true, true, false
。有关详细示例,请参阅https://ideone.com/lsqovs。
我想这是一个品味问题,尽管(错误地)将它们混合起来可能会导致一些不良行为:
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
错误标记为语法错误的可能性要小得多。我还发现和/或更容易阅读。FWIW,大多数表达偏好的 PHP 框架(大多数不)指定和/或。我也从来没有遇到过一个真实的、非人为的案例,这很重要。