我有一个代码库,开发人员决定使用AND
and OR
代替&&
and ||
。
我知道运算符的优先级(&&
之前and
)有所不同,但是使用给定的框架(准确地说是PrestaShop),这显然不是原因。
您正在使用哪个版本?是and
不是更具有可读性&&
?还是没有区别?
我有一个代码库,开发人员决定使用AND
and OR
代替&&
and ||
。
我知道运算符的优先级(&&
之前and
)有所不同,但是使用给定的框架(准确地说是PrestaShop),这显然不是原因。
您正在使用哪个版本?是and
不是更具有可读性&&
?还是没有区别?
Answers:
如果使用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)
and
or
一次完全DEPRECATE 。我看到太多的人以为他们是完全一样的东西,这里的答案是更多的推荐。
$foo and bar()
,它们是if语句的不错的捷径。如果意外的行为(来自错误的文档,或者没有阅读)是不使用某些东西的原因,我们根本不会在谈论使用PHP。
根据其使用方式,它可能是必要的,甚至是方便的。 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框架中看到的每一次出现都提到过。
if ($f = false or true) $f = true;
-结果最终将$f
成为真,因为该表达式的整体评价为真。
$f
将其分配为false-但条件的计算结果为true,因此将$f
其覆盖。如果条件评估为假,$f
则将永远不会被任何一种方式覆盖。
and
于&&
,在and
某些情况下&&
按预期工作,而在所有情况下按预期工作情况。
为了安全起见,我总是在比较中加上括号并隔开。这样,我不必依靠运算符的优先级:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
让我解释一下“和”-“ &&”-“&”之间的区别。
“ &&”和“ and”都是逻辑 “与” 运算,它们执行相同的操作,但是运算符的优先级不同。
运算符的优先级(优先级)指定它如何“紧密”地将两个表达式绑定在一起。例如,在表达式1 + 5 * 3中,答案是16,而不是18,因为乘法(“ *”)运算符的优先级高于加法(“ +”)运算符。
在单个操作中,将它们混合在一起可能会给您带来意想不到的结果,在某些情况下, 我建议始终使用&&,但这是您的选择。
另一方面,“&”是按位AND运算。它用于评估和处理整数值内的特定位。
例如,如果您执行(14&7),结果将为6。
7 = 0111
14 = 1110
------------
= 0110 == 6
我猜这是一个口味问题,尽管(错误地)将它们混合可能会导致一些不良行为:
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
是因为赋值运算符的优先级高于任何逻辑运算符,正如其他答案中已经很好解释的那样。
另一个很好的例子,它使用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。
~
是按位NOT运算符,而不是逻辑运算符。;-)