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

我知道运算符的优先级有所不同(&&and之前),但是具有给定的框架(确切地说,PrestaShop)显然不是原因。
您使用的是哪个版本? and&&更易读吗?还是没有区别?

评论

注意〜是按位NOT运算符,而不是逻辑。 ;-)

是的我知道。陋习 :) 。在PHP中有'and','or'和'xor'有点奇怪,但是没有'not',不是吗?

@ts:正确的答案是R. Bemrose提供的答案stackoverflow.com/questions/2803321/and-vs-as-operator/…

!是逻辑非运算符

@chiliNUT非常正确。当时一定是有道理的。似乎潜伏的错误答案在这一点上已经受到惩罚:)

#1 楼

如果您使用ANDOR,最终将被如下所示的东西绊倒:

$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)


评论


+1:这应该在PHP文档中清晰明了,或者PHP应该进行更改,并为这些运算符或DEPRECATE赋予相同的优先级,或者全部赋予一次。我看到太多的人以为他们是完全一样的东西,这里的答案是更多的推荐。

– Marco Demaio
2011年5月24日15:44

实际上,其他语言(例如Perl和Ruby)也具有这些具有相同优先级区别的变体,因此通过在PHP中使优先级相等来偏离此标准(无论是初学者还是令人困惑的)都是不明智的。更不用说大量PHP应用程序的向后兼容性。

–MladenJablanović
2012年1月25日上午8:27

人们无法阅读某种语言的文档并不会使该语言的决定错误。正如Mladen指出的那样,Perl和Ruby也使用这些额外的运算符,并且具有相同的优先级。它允许使用诸如$ foo和bar()之类的结构,它们是if语句的不错的快捷方式。如果意外的行为(来自错误的文档,或者没有阅读)是不使用某些东西的原因,我们根本不会在谈论使用PHP。

– Altreus
2012年8月30日上午11:49

我花了3分钟找到错误的行:$ this = true,:(还有$ truthiness =($ this和$ that);对我来说看起来更好:)

–德米特里(Dmitriy Kozmenko)
2013年5月6日15:52



我同意Dmitriy的观点-将布尔值评估括在括号内有助于澄清代码的意图。我认为运算符及其所具有的功能很有价值,并且与其他语言保持一致,理解语言是程序员的工作。

– Jon z
13年5月12日13:59

#2 楼

根据使用方式,可能有必要甚至很方便。
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;


但是在大​​多数情况下,这似乎更像是开发人员的品味,就像我在@Sarfraz这样的CodeIgniter框架中看到的每一次出现都提到过。

评论


值得注意的是,如果该表达式是较大语句的一部分,则不会忽略“ true”。考虑以下情况:($ f = false或true)$ f = true; -结果将是$ f最终变为true,因为该表达式的总和为true。

–克里斯·布朗(Chris Browne)
2012年3月15日在22:04

不,您只是稍后重写变量。该表达式仍然计算为false,然后在下一行用true覆盖它。

– r3wt
14年5月13日在21:50

实际上,他是对的。首先,将$ f分配为false-但条件的计算结果为true,因此$ f被覆盖。如果条件评估为假,则$ f将永远不会被任何一种方式覆盖。

–ahouse101
14年6月29日在23:58

建议开发人员遵循自己的口味是荒谬的。不用担心另一个试图维护相同代码的开发人员的噩梦,编写代码本身的开发人员会在任何编写的代码中犯语义错误,因为s / he优先于&&,并且在某些情况下按预期工作,并且&&可以正常工作在所有情况下都如预期。

– ADTC
18-09-7在19:49

#3 楼

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

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


评论


就我个人而言,我认为添加多余的不必要的括号会使阅读变得比仅仅拥有所需的内容更加令人困惑。例如,我认为这更容易阅读:if(($ i == 0 && $ b == 2)||($ c == 3 && $ f!= 5))

–rooby
2014年5月11日7:40



我认为这是我整天看过的最漂亮的代码。做得好。

–rm-vanda
2014年12月30日22:58

由于PHP是一种解释型语言,因此如果您在代码中不使用不必要的空格或换行符,它将可以快速运行。如果对编译语言执行相同操作,则只会花费更多时间进行编译,而不会对运行时生效。我并不是说只做一次会产生显着差异,但是在整个使用php + javascript的应用程序中,两者的编写都像示例一样……加载时间肯定会更长。说明:空格和换行被忽略,但是要忽略它们,必须对其进行检查。这在运行时在解释的lang上以及在编译的lang上进行编译时发生。

– JoelBonetR
18-4-6在19:12



@JoelBonetR,如果您使用的是php opcache或类似的缓存,则无需担心加载时间。我希望没有人运行没有它的生产php网站...

–́PeloNZ
18年9月18日在1:38

@PeloNZ so you can write dirty because it will be cached anyway and the entire project will take only a second more to load when refresh, huh? To code clean is for yourself and your teammates, concerning about timings was only a point that most people ignore or simply didn't know.

– JoelBonetR
Sep 18 '18 at 5:04



#4 楼

&&和and之间的优先级有所不同(&&的优先级高于and的优先级),这在与三元运算符结合使用时会引起混淆。例如,

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


将返回字符串,而

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


将返回布尔值。

#5 楼

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


#6 楼


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


“ &&”和“ and”都是逻辑AND运算,它们执行相同,但是运算符的优先级不同。

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

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


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

示例(如果执行(14&7),结果将为6。

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


#7 楼


您正在使用哪个版本?


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


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


对您来说更易读。答案是“是”,“否”取决于许多因素,包括操作员周围的代码以及确实是阅读它的人!


||有区别吗?


是的。请参阅||的逻辑运算符和~的按位运算符。

#8 楼

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

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是因为赋值运算符的优先级高于任何逻辑运算符,正如在下面已经很好解释的那样其他答案。

评论


这不是真的,它们都返回false。

–杰伊
13年2月22日在0:26

#9 楼

这是一个小例子:

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


输出:与= / ==错字相比,它更容易引起隐患(与adnro几乎相同),并且不太可能被注意到,因为错字会标记为语法错误。我也发现和/或更容易阅读。 FWIW,大多数表示偏好的PHP框架(大多数没有)指定和/或。我也从未遇到过真正重要的情况。

#10 楼

使用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。