perl でビット演算の結果を数値比較する際の注意点

ハマったのでメモ。

perl で、ビット演算の計算結果と数値を比較する判定文を書いたら、これがうまくいかない。書いたのは、次のようなコード。

if ($var & 1 == 0) {
	print $var;
}

$var の値が 1 だろうが 0 だろうが、とにかく結果は 0 となって $var が出力されない。これだけシンプルだと逆に原因が特定できずに困る。

答えは、「Perl の演算子と優先順位」にありました。要するに、比較演算子の方が、ビット演算子より先に評価されたため、常に演算結果が 0 となっていたのでした。これは盲点。

ということで、以下のように修正して解決。

if (($var & 1) == 0) {
	print $var;
}

このことは、特段 perl に限った話ではなくて、php でも同様だったし、java にいたってはコンパイルエラーになってしまった。(eclipse では、エラーに対して、親切に「小括弧内にビット演算命令を入れます」というヒントまで出てきた)

ビット演算は便利なのでよく使ってしまうんですが、評価順を意識しておかないと、思わぬバグが出てしまうことになるので、要注意ですね。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/512