& # 39;和# 39;vs & # 39;,, & # 39;作为运营商

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

我知道运算符的优先级存在差异(&&and之前),但对于给定的框架(确切地说是PrestaShop),这显然不是一个原因。

你用的是哪个版本?and&&更易读吗?还是没有区别?

202431 次浏览
取决于它的使用方式,它可能是必要的,甚至是方便的。 http://php.net/manual/en/language.operators.logical.php < / p >
// "||" 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 && 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的原因是因为赋值操作符优先于任何逻辑操作符,这在其他回答中已经很好地解释了。

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

$this_one = true;
$that = false;


$truthiness = $this_one and $that;

想猜猜$truthiness等于什么?

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

上面的$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"

将返回布尔

为了安全起见,我总是用圆括号括起来,并将它们分隔开。这样,我就不必依赖运算符优先级:

if(
((i==0) && (b==2))
||
((c==3) && !(f==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

这里有一个小反例:

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

输出:

bool(false)

我想说这种类型的错字更有可能导致潜在的问题(在很大程度上与= vs ==相同),并且比adn/ro错字更不容易被注意到,后者将标记为语法错误。我还发现and/or更容易阅读。总之,大多数PHP框架表达了首选项(大多数没有)指定and/or。我也从来没有遇到过一个真实的、不做作的情况,在这种情况下它会很重要。

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

"&&"和"and"都是逻辑与运算,它们做同样的事情,但运算符优先级不同。

运算符的优先级(优先级)指定了它将两个表达式绑定在一起的“紧密程度”。例如,在表达式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, falsetrue, true, false的情况下是不同的。 关于详细的例子,请参见https://ideone.com/lsqovs