为什么$ x在这个表达式中是真的?在PHP中用bool表达式赋值:奇怪的行为
$x = true and false;
我有问题,有些变量,但我可以在问题减少到原始的布尔值。
更新: 正如您在回复中看到的效果与PHP中的运算符precedense有关。还有一个good explanation about the problem in this question,我在网上找不到,因为我不知道我有这个问题,我不知道'& &'/'||'之间有区别,和'和'/'或'。
为什么$ x在这个表达式中是真的?在PHP中用bool表达式赋值:奇怪的行为
$x = true and false;
我有问题,有些变量,但我可以在问题减少到原始的布尔值。
更新: 正如您在回复中看到的效果与PHP中的运算符precedense有关。还有一个good explanation about the problem in this question,我在网上找不到,因为我不知道我有这个问题,我不知道'& &'/'||'之间有区别,和'和'/'或'。
经过一番搜索,我发现这是由operator precedence in PHP.引起的'='运算符比'and'更强。
如果你想让你必须使用括号预期的结果:
$x = (true and false); //correct: $x is false now!
如果没有括号中的表达式等于($x = true) and false;
。 $ x将获得'真正'的价值。之后,PHP解释器用$ x刚刚获得的值“替换”此赋值。所以true and false;
仍然存在。而这没有任何作用。 '假'丢失,并没有影响表达。
请注意,如果您使用'& &'或'||',则不需要大括号!它们比“=”更强,因此比“和”和“或”更强。奇怪...
这与例如$x = 5 + 6;
因为这里'+'比'='强,它会首先被解决。最后,它只影响布尔运算符'和','或'和'xor'。只有与他们在一起,你必须小心。
还请注意,与JavaScript或Java等其他语言相比,这是不同的。在这些语言中,由于逻辑运算符强于等号运算符(Operators in JavaScript,Operators in Java),因此不需要大括号。
更多内容:
$x = true and false;
因此,我们有以下。如果你猜$x
是真的,你会是对的。由于=
比and
有更高的先例。
重写表达上述这将是等于这个:
($x = true) and false;
在此处,它变得有趣。
如果你做的事:
$x = true && false;
,你猜那$x
是真的,你就错了。在这种情况下,$x
实际上是错误的。
上述表达式实际上等于:
$x = (true and false);
为什么呢?因为&&
比and
有更高的先例。
所以基本上[this](http://php.net/manual/en/language.operators.precedence.php)。 – 2015-03-13 13:04:54
@AndreiP。是。我花了一段时间才发现,因为我正在考虑Java ... – robsch 2015-03-13 13:07:42
你发布这个问题之前你知道答案吗?两者都有相同的时间戳。 – 2015-03-13 13:13:16