'AND'vs'&&'作为运营商

ts.*_*ts. 285 php coding-style operators

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

我知道运营商的优先级(&&之前and)有所不同,但是对于给定的框架(PrestaShop来说准确),显然不是理由.

你使用的是哪个版本?是and不是更具有可读性&&?或者没有区别?

Pow*_*ord 639

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

$this_one = true;
$that = false;

$truthiness = $this_one and $that;
Run Code Online (Sandbox Code Playgroud)

想猜猜什么$truthiness等于?

如果你说false... bzzzt,对不起,错了!

$truthiness以上有价值true.为什么? =具有更高的优先级and.添加括号以显示隐式顺序使得这更清楚:

($truthiness = $this_one) and $that
Run Code Online (Sandbox Code Playgroud)

如果您使用&&而不是and在第一个代码示例中,它将按预期工作并且可以false.

正如下面的评论中所讨论的,这也可以获得正确的值,因为括号的优先级高于=:

$truthiness = ($this_one and $that)
Run Code Online (Sandbox Code Playgroud)

  • +1:这应该在PHP文档中变得清晰明了,或者PHP应该改变并给予这些运算符相同的优先级,或者为所有人提供DEPRECATE`和``或`.我看到太多人认为他们是完全相同的东西,这里的答案是更多的推荐. (129认同)
  • 人们无法阅读语言的文档并不会使语言的决定错误.正如Mladen所说,Perl和Ruby也使用这些额外的运算符,并具有相同的优先级.它允许构造诸如`$ foo和bar()`,它们是if语句的很好的快捷方式.如果出现意外行为(来自错误的文档,或者没有阅读它)是不使用某些东西的原因,我们根本不会谈论使用PHP. (23认同)
  • 实际上,其他语言(例如,Perl和Ruby)也有这些变体具有相同的优先级区别,因此通过在PHP中使优先级相等而偏离此标准(不管它可能对初学者来说是令人费解的)是不明智的.更不用说大量PHP应用程序的向后兼容性. (11认同)
  • 我同意Dmitriy - 在括号中包含布尔值评估有助于澄清代码的意图.我认为运算符及其现在存在的功能是有价值的并且与其他语言一致,程序员的工作就是理解语言. (6认同)
  • 我花了3分钟找到错误的行:**$ this = true**,:(和$ truthiness =($ this和$ that);它看起来对我来说更好:) (2认同)
  • 我曾经避免使用&&和|| 因为我错误地认为他们是遗产,因为他们没有读作"英语",但他们几乎总是我想要的. (2认同)
  • OMG WTF PHP EOM (2认同)

ada*_*Lev 43

根据它的使用方式,它可能是必要的,甚至是方便的. 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;
Run Code Online (Sandbox Code Playgroud)

但在大多数情况下,它似乎更像是一个开发人员喜欢的东西,就像我在CodeIgniter框架中看到的每次出现的那样,如@Sarfraz所提到的.

  • 值得注意的是,如果该表达式是更大声明的一部分,则不会忽略"true".考虑一下`if($ f = false或true)$ f = true;` - 结果将是`$ f`最终变为真,因为表达式的整体评估为真. (2认同)
  • 实际上,他是对的.首先,`$ f`被赋值为false - 但条件的计算结果为true,因此`$ f`被覆盖.如果条件评估为false,那么`$ f`绝对不会被覆盖. (2认同)

Cap*_*chi 11

为了安全起见,我总是将我的比较括起来并将它们分开.这样,我不必依赖运算符优先级:

if( 
    ((i==0) && (b==2)) 
    || 
    ((c==3) && !(f==5)) 
  )
Run Code Online (Sandbox Code Playgroud)

  • 就个人而言,我认为添加额外不必要的括号会使阅读更加困惑,而不仅仅是满足您的需求.例如,我认为这更容易阅读:if(($ i == 0 && $ b == 2)||($ c == 3 && $ f!= 5)) (29认同)
  • 非常安全.好. (4认同)
  • 我认为这是我整天看过的最漂亮的代码.做得好. (3认同)

arv*_*man 9

优先级之间不同&&(&&的优先级高于与),东西时,与三元运算符组合引起的混乱.例如,

$predA && $predB ? "foo" : "bar"
Run Code Online (Sandbox Code Playgroud)

将返回一个字符串

$predA and $predB ? "foo" : "bar"
Run Code Online (Sandbox Code Playgroud)

将返回一个布尔值.


Jus*_*nas 8

由于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
Run Code Online (Sandbox Code Playgroud)