【发布时间】:2017-06-07 14:02:53
【问题描述】:
使用 php 7.1.0 我正在运行这个小测试:
<?php
$a = true;
$b = true;
$value = $a xor $b;
if ($value == true) {
print "bad!\n";
} else {
print "good\n";
}
它回来说不好。为什么?两个真值的异或应该是 FALSE,而不是 true。
【问题讨论】:
使用 php 7.1.0 我正在运行这个小测试:
<?php
$a = true;
$b = true;
$value = $a xor $b;
if ($value == true) {
print "bad!\n";
} else {
print "good\n";
}
它回来说不好。为什么?两个真值的异或应该是 FALSE,而不是 true。
【问题讨论】:
问题是运算符优先级。 xor 运算符的优先级低于 =,因此您的语句相当于:
($value = $a) xor $b;
你需要写:
$value = ($a xor $b);
或
$value = $a ^ $b;
^ 运算符是按位异或,而不是布尔值。但是true 和false 将被转换为1 和0,并且按位结果将等同于布尔结果。但是如果变量的原始值可能是数字,这将不起作用——所有非零数字都是真实的,但是当你对它们执行按位异或时,你将得到任何两个不同数字的真实结果.
见PHP Operator Precedence Table
查看相关Assignment in PHP with bool expression: strange behaviour
【讨论】:
and 和or 保持一致。不同之处在于它们还有&&和||的变体,具有更高的优先级,但没有xor的高优先级变体。
^ 是二进制 XOR,而不是布尔值。