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