Cにおける&演算子の優先度の件

今日お仕事でコードの確認をしていたのですがバグにどうしても気がつきませんでした。組み込みは今回の業務が初めてだったので、ビット演算の扱いに不慣れなことが原因。要約すると

if (hoge & 0x3 == 0x2) {
  /* なんかの処理 */
} else {
  /* なんかの処理 */
}

つまりhogeの下位2ビットを見てそれが0x2に等しいかどうかをチェックして処理する、、という風にしたかったのである。しかし動作確認するとどうも意図とは違う。これはC FAQでよくネタになるのだが演算子の優先順位の問題で&演算子より==演算子の方が優先度が高いのだ。よって上記のifの条件の中では0x3と0x2が等しいかまずチェックされる。等しくないのでこれは0x0になり,0x0とhogeの&演算が行われるわけだ。

自分でコーディングをする場合はまず間違いなく括弧を忘れないのだが、人のコードを読んでいて気づかなかったのはまだ慣れが足りないのだろう。社内のC言語勉強会のネタにする。