4
使用PHP 7.1.0我跑这个小测试:PHP XOR返回错误值
<?php
$a = true;
$b = true;
$value = $a xor $b;
if ($value == true) {
print "bad!\n";
} else {
print "good\n";
}
,它要回来,说坏。为什么?两个真值的异或应该是FALSE,而不是真的。
使用PHP 7.1.0我跑这个小测试:PHP XOR返回错误值
<?php
$a = true;
$b = true;
$value = $a xor $b;
if ($value == true) {
print "bad!\n";
} else {
print "good\n";
}
,它要回来,说坏。为什么?两个真值的异或应该是FALSE,而不是真的。
问题是运算符优先级。该xor
操作符比=
优先级高,所以你的语句相当于:
($value = $a) xor $b;
你需要写:
$value = ($a xor $b);
或
$value = $a^$b;
的^
操作是按位XOR,不是布尔值。但是true
和false
将被转换为1
和0
,并且按位结果将等同于布尔结果。但是,如果变量的原始值可能是数字,那么这将不起作用 - 所有非零数字都是真的,但是当您对它们执行按位XOR时,您将得到任何两个不同数字的真实结果。
见PHP Operator Precedence Table
请参阅相关Assignment in PHP with bool expression: strange behaviour
嗯,这只是愚蠢:)谢谢。 – Gargoyle
正确和快速。 +1 –
@Gargoyle这大概是为了和'and'和'or'一致而完成的。区别在于它们也有'&&'和'||'变体,它们具有更高的优先级,但没有'xor'的高优先级变体。 – Barmar