#ハマり概要
xor演算子の挙動がおかしい。true xor true
がtrue
になる。
#ハマり時のコード
php
<?php
$P = true;
$Q = true;
$cond = $P xor $Q;
echo 'P is '.stringify($P)."\n";
echo 'Q is '.stringify($Q)."\n";
echo 'P xor Q is '.stringify($cond)."\n";
function stringify($bool)
{
if ($bool) {
return 'true';
}
return 'false';
}
stdout
P is true
Q is true
P xor Q is true # おかしい
#XOR(排他的論理和)
T | F | |
---|---|---|
T | F | T |
F | T | F |
T xor T => F になるはずが
上記のコードでは
T xor T => T になってる
#勘違いポイント
xor
は=
よりも優先順位が低い。
##つまり
この式は
$cond = $P xor $Q;
これと等価
($cond = $P) xor $Q;
$cond
に$P
(true
)が代入され、
その返値true
と$Q
のxor
が評価され(false
)、
その評価値は虚空へと捨てられている。
#修正
なので、コードを以下のように修正する。
php
<?php
$P = true;
$Q = true;
$cond = ($P xor $Q); # 修正
echo 'P is '.stringify($P)."\n";
echo 'Q is '.stringify($Q)."\n";
echo 'P xor Q is '.stringify($cond)."\n";
function stringify($bool)
{
if ($bool) {
return 'true';
}
return 'false';
}
stdout
P is true
Q is true
P xor Q is false
おk