ハマり概要
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
