11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

xorの優先順位

Posted at

#ハマり概要

xor演算子の挙動がおかしい。true xor truetrueになる。

#ハマり時のコード

ideone

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=よりも優先順位が低い。

PHP: 演算子の優先順位 - Manual

スクリーンショット 2016-03-29 14.08.11.png

##つまり

この式は

$cond = $P xor $Q;

これと等価

($cond = $P) xor $Q;

$cond$P(true)が代入され、
その返値true$Qxorが評価され(false)、
その評価値は虚空へと捨てられている。

#修正
なので、コードを以下のように修正する。

ideone

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

11
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?