我有一个代码库,开发人员决定使用AND和OR,而不是&&和||。
我知道运算符的优先级是不同的(&&在和之前),但对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。
你用的是哪个版本?and比&&更易读?还是没有区别?
我有一个代码库,开发人员决定使用AND和OR,而不是&&和||。
我知道运算符的优先级是不同的(&&在和之前),但对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。
你用的是哪个版本?and比&&更易读?还是没有区别?
当前回答
如果你使用AND和OR,你最终会被这样的东西绊倒:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
想猜猜$truthiness等于什么吗?
如果你说错…对不起,错了!
上面的$truthiness值为true。为什么?=的优先级高于and。添加括号来显示隐式顺序,使其更清晰:
($truthiness = $this_one) and $that
如果在第一个代码示例中使用&&而不是and,那么它将像预期的那样工作,结果为false。
正如下面评论中讨论的那样,这也可以获得正确的值,因为括号的优先级高于=:
$truthiness = ($this_one and $that)
其他回答
&&和和之间的优先级不同(&&的优先级高于and),这在与三元运算符组合时会引起混淆。例如,
$predA && $predB ? "foo" : "bar"
将返回一个字符串,而
$predA and $predB ? "foo" : "bar"
将返回布尔值。
让我解释一下"和" - "& &" - "&"的区别。
“&&”和“and”都是逻辑与操作,它们做同样的事情,但操作符优先级不同。
运算符的优先级(优先级)指定了它将两个表达式绑定在一起的“紧密程度”。例如,在表达式1 + 5 * 3中,答案是16而不是18,因为乘法(“*”)运算符的优先级高于加法(“+”)运算符。
在一次操作中混合它们,在某些情况下可能会给你意想不到的结果 我建议总是使用&&,但那是你的选择。
另一方面,"&"是一个按位的AND操作。它用于计算和操作整数值中的特定位。
例如,如果你这样做(14 & 7),结果将是6。
7 = 0111
14 = 1110
------------
= 0110 == 6
为了安全起见,我总是用圆括号括起来,并将它们分隔开。这样,我就不必依赖运算符优先级:
if(
((i==0) && (b==2))
||
((c==3) && !(f==5))
)
如果你使用AND和OR,你最终会被这样的东西绊倒:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
想猜猜$truthiness等于什么吗?
如果你说错…对不起,错了!
上面的$truthiness值为true。为什么?=的优先级高于and。添加括号来显示隐式顺序,使其更清晰:
($truthiness = $this_one) and $that
如果在第一个代码示例中使用&&而不是and,那么它将像预期的那样工作,结果为false。
正如下面评论中讨论的那样,这也可以获得正确的值,因为括号的优先级高于=:
$truthiness = ($this_one and $that)
我想这是一个品味问题,尽管(错误地)把它们混在一起可能会导致一些不受欢迎的行为:
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的原因是因为赋值操作符优先于任何逻辑操作符,这在其他回答中已经很好地解释了。