用bool表达式在PHP中赋值:奇怪的行为

时间:2015-03-13 13:02:13

标签: php variable-assignment operator-precedence boolean-expression

为什么这个陈述中的$ x为真?

$x = true and false;

我遇到了一些变量的问题,但我可以将问题减少到原始的布尔值。

更新 正如您在回复中看到的那样,效果与PHP中的运算符优先级有关。还有一个good explanation about the problem in this question,我之前无法在网上找到,因为我不知道我有这方面的问题,我也不知道存在差异介于'&&' /' ||'和'和' /'或'。

2 个答案:

答案 0 :(得分:3)

经过一些搜索,我发现这是由operator precedence in PHP.' ='运营商比'和'更强。

如果你想获得预期的结果,你必须使用大括号:

$x = (true and false); //correct: $x is false now!

没有大括号,表达式等于($x = true) and false;。 $ x将获得真实的'值。之后,PHP解释器取代了'这个赋值是$ x刚刚得到的值。所以true and false;仍然存在。这没有任何作用。 '假'失去了,并没有影响表达。

请注意,如果您使用&&&'并且不需要牙箍。或者' ||'!它们强于' ='因而强于和#39;和'或'。奇怪...

这与例如不同$x = 5 + 6;因为这里' +'比'' ='更强它会先解决。最后它只影响布尔运算符'和','或'和' xor'。只有他们,你必须要小心。

另请注意,与JavaScript或Java等其他语言相比,这是不同的。在这些语言中,您不需要括号,因为逻辑运算符比等运算符强(Operators in JavaScriptOperators in Java)。

答案 1 :(得分:0)

更多相关内容:

$x = true and false;

所以我们有以下内容。如果您猜到$x是真的,那么您是对的。由于=的先例高于and

重写上面的表达式将等于:

 ($x = true) and false;

这里有趣的地方。

如果你这样做:

 $x = true && false;

并且你猜测$x是真的,你错了。在这种情况下,$x实际上是假的。

上述表达式实际上等于:

$x = (true and false);

为什么呢?因为&&的先例高于and