ハマったのでメモ。
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